2

汎用実装から継承するリポジトリ クラスがあります。

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

汎用リポジトリの実装では、Fluent NHibernate 規則が使用されます。彼らはうまくいっています。これらの規則の 1 つは、すべてのプロパティが null 可能ではないということです。

ここで、特定のプロパティが規約外で null 可能になる可能性があることを定義する必要があります。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 クラスで this.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 に答える