FluentNHibernate覆盖:UseOverridesFromAssemblyOf非泛型版本

时间:2010-04-02 00:36:11

标签: c# generics fluent-nhibernate override automapping

我有一个继承自通用实现的存储库类:

public namespace RepositoryImplementation {
    public class PersonRepository : Web.Generics.GenericNHibernateRepository<Person>
}

通用存储库实现使用Fluent NHibernate约定。他们工作正常。其中一个惯例是所有属性都不可为空。

现在我需要定义特定属性可以在约定之外可以为空。流畅的NHibernate有一个有趣的覆盖机制:

public namespace RepositoryImplementation {
    public class PersonMappingOverride : IAutoMappingOverride<Person> {
        public void Override(FluentNHibernate.Automapping.AutoMapping<Funcionario> mapping)
        {
            mapping.Map(x => x.PhoneNumber).Nullable();
        }
    }
}

现在我需要将覆盖类注册到Fluent NHibernate中。我在Web.Generics.GenericNHibernateRepository泛型类中有以下代码:

AutoMap.AssemblyOf<Person>()
  .Where(type => type.Namespace == "Entities")
  .UseOverridesFromAssemblyOf<PersonMappingOverride>();

问题是:UseOverridesFromAssemblyOf是一种通用方法,我做不到这样的事情:

.UseOverridesFromAssemblyOf<PersonMappingOverride>();

因为这会导致循环引用。我不希望通用存储库知道存储库或映射覆盖类,因为它们因项目而异。

我看到另一种解决方案:在GenericNHibernateRepository类中,我可以执行此操作.GetType()并获取存储库实现类型(例如:PersonRepository)。但是,我无法调用UseOverridesFromAssemblyOf()传递类型。

是否有另一种方法可以在FluentNHibernate中配置覆盖?如果没有,如何在不使通用存储库依赖于存储库实现或映射覆盖类的情况下调用UseOverridesFromAssemblyOf<T>

(资料来源:http://wiki.fluentnhibernate.org/Auto_mapping#Overrides

1 个答案:

答案 0 :(得分:2)

这是我的方式(来源于http://github.com/ToJans/MVCExtensions/blob/master/src/MvcExtensions/Services/Impl/FluentNHibernate/Database.cs

    am1.GetType()
   .GetMethod("UseOverridesFromAssemblyOf")
   .MakeGenericMethod(mappings.GetType())
   .Invoke(am1,null);