#c# #generics #reflection #fluent-nhibernate #sharp-architecture
#c# #общие #отражение #свободно-nhibernate #четкая архитектура
Вопрос:
Я работаю над проектом с четкой архитектурой, в котором сочетаются плавные сопоставления и автоматические сопоставления. В базовом проекте с четкой архитектурой уже есть метод (AutoMappingConfiguration.ShouldMap), который определяет, должен ли тип автоматически отображаться или нет. Мой в настоящее время выглядит следующим образом:
public override bool ShouldMap(System.Type type)
{
if (type == typeof(ActiveUser))
return false;
return type.GetInterfaces().Any(x =>
x.IsGenericType amp;amp; x.GetGenericTypeDefinition() == typeof(IEntityWithTypedId<>));
}
По сути, тип ActiveUser сопоставляется с использованием fluent mapping, а все остальное сопоставляется с использованием auto mapping, за исключением, конечно, общих базовых классов. Я нахожусь на том этапе, когда я буду добавлять более свободно отображаемые классы и действительно не хочу продолжать добавлять операторы if к этому методу, чтобы исключить их. Мне в основном нужен метод
bool ShouldMap(System.Type type)
чтобы вернуть true, если универсальный класс
ClassMap<type>
существует.
Есть предложения?
Ответ №1:
Вы можете создать универсальный тип, используя Type.MakeGenericType, поэтому предполагая, что у вас есть сборка, которая содержит все сопоставления, которые вы можете выполнить:
public bool ShouldMap(Assembly mappingAssembly, Type type)
{
Type classMapType = typeof(ClassMap<>).MakeGenericType(type);
return mappingAssembly.GetTypes().Any(t => t.IsSubclassOf(classMapType));
}
Ответ №2:
рассматривали ли вы возможность отображения ВСЕХ классов, но с использованием переопределения*отображения * для классов, которые вы хотите отобразить явно (вместо обычного fluent mapping)?