2

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

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

通用存储库实现使用 Fluent NHibernate 约定。他们工作正常。这些约定之一是所有属性都不能为空。

现在我需要定义特定属性可能在约定之外可以为空。Fluent 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 )

4

1 回答 1

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);
于 2010-04-13T14:33:12.527 回答