Substituições do FluentNHibernate:UseOverridesFromAssemblyOf versão não genérica
-
23-09-2019 - |
Pergunta
Tenho uma classe de repositório que herda de uma implementação genérica:
public namespace RepositoryImplementation {
public class PersonRepository : Web.Generics.GenericNHibernateRepository<Person>
}
A implementação do repositório genérico usa convenções do Fluent NHibernate.Eles estão funcionando bem.Uma dessas convenções é que todas as propriedades não são anuláveis.
Agora preciso definir que propriedades específicas podem ser anuláveis fora das convenções.O Fluent NHibernate possui um mecanismo de substituição interessante:
public namespace RepositoryImplementation {
public class PersonMappingOverride : IAutoMappingOverride<Person> {
public void Override(FluentNHibernate.Automapping.AutoMapping<Funcionario> mapping)
{
mapping.Map(x => x.PhoneNumber).Nullable();
}
}
}
Agora preciso registrar a classe de substituição no Fluent NHibernate.Eu tenho o seguinte código no Web.Generics.GenericNHibernateRepository
classe genérica:
AutoMap.AssemblyOf<Person>()
.Where(type => type.Namespace == "Entities")
.UseOverridesFromAssemblyOf<PersonMappingOverride>();
O problema é: UseOverridesFromAssemblyOf
é um método genérico e não posso fazer algo assim:
.UseOverridesFromAssemblyOf<PersonMappingOverride>();
Porque isso causaria uma referência circular.Não quero que o repositório genérico conheça o repositório ou a classe de substituição de mapeamento, porque eles variam de projeto para projeto.
Vejo outra solução:na classe GenericNHibernateRepository posso fazer this.GetType() e obter o tipo de implementação do repositório (por exemplo:PessoaRepositório).No entanto, não posso ligar UseOverridesFromAssemblyOf()
passando um tipo.
Existe outra maneira de configurar substituições no FluentNHibernate?Se não, como eu poderia ligar UseOverridesFromAssemblyOf<T>
sem fazer com que o repositório genérico dependa da implementação do repositório ou da classe de substituição de mapeamento?
(Fonte: http://wiki.fluentnhibernate.org/Auto_mapping#Overrides)
Solução
Aqui está como eu faço isso (fonte em http://github.com/ToJans/MVCExtensions/blob/master/src/MvcExtensions/Services/Impl/FluentNHibernate/Database.cs )
am1.GetType()
.GetMethod("UseOverridesFromAssemblyOf")
.MakeGenericMethod(mappings.GetType())
.Invoke(am1,null);