汎用実装から継承するリポジトリ クラスがあります。
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 )