Таким образом, проблема с .UseOverridesFromAssemblyOf в том, что они не дублируют тип.
Код взят из FluentNHibernate:
public AutoPersistenceModel UseOverridesFromAssembly(Assembly assembly)
{
this.alterations.Add(new AutoMappingOverrideAlteration(assembly));
return this;
}
public AutoMappingAlterationCollection Add(IAutoMappingAlteration alteration)
{
if (!this.alterations.Exists(a => a.GetType() == alteration.GetType()))
{
this.alterations.Add(alteration);
}
return this;
}
Вы можете видеть, что добавление дублированного типа запрещено.
После изучения кода FNH я обнаружил, что они, наконец, изменяют AutoMappingOverrideAlteration, и я просто пишу расширение, чтобы применить это изменение
public static class AutoPersistenceModelExtension
{
public static AutoPersistenceModel AddMappingAssembly(this AutoPersistenceModel model, Assembly assembly)
{
new AutoMappingOverrideAlteration(assembly).Alter(model);
return model;
}
public static AutoPersistenceModel AddMappingFromAssemblyOf<T>(this AutoPersistenceModel model)
{
return model.AddEntityAssembly(typeof (T).Assembly);
}
}
Результат:
Наше приложение построено на основе компонентов, каждый из которых предоставляет свои сущности и сопоставления для этих сущностей. Каждый компонент должен быть производным от класса BaseComponent, который имеет абстрактный метод для изменения модели.
Ex of FulfillmentModuleRegistration:
public override void AddToModel(AutoPersistenceModel autoPersistenceModel)
{
autoPersistenceModel.AddEntityAssembly(typeof(SupplierListItem).Assembly);
autoPersistenceModel.AddMappingFromAssemblyOf<SupplierListItemMappingOverride>();
}
и наши global.asax.cs:
var autoPersistenceModel = new AutoPersistenceModelGenerator().Generate();
//TODO: Refactor this, instead of instantiate each module we have to go thought a list of loaded module and apply their model alteration
new QuestionBankModuleRegistration().AddToModel(autoPersistenceModel);
new FulfilmentServiceAreaRegistration().AddToModel(autoPersistenceModel);
var cfg = NHibernateSession.Init(
this.webSessionStorage,
new[] { this.Server.MapPath("~/bin/baseMappings.dll") },
autoPersistenceModel,
this.Server.MapPath("~/Hibernate.cfg.xml"));
baseMappings.dll содержит наши базовые объекты, такие как: пользователи, поисковые запросы и т. Д. Таким образом, это может быть любая сборка, которая содержит базовые, сопоставления по умолчанию, соглашения и т. Д.