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)

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top