Domanda

Ho una classe repository che eredita da un'implementazione generica:

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

L'implementazione repository generico utilizza convenzioni Fluent NHibernate. Stanno lavorando bene. Una di queste convenzioni è che tutte le proprietà non sono annullabili.

Ora ho bisogno di definire che le proprietà specifiche possono essere al di fuori delle convenzioni nullable. Fluent NHibernate ha un interessante meccanismo di esclusione:

public namespace RepositoryImplementation {
    public class PersonMappingOverride : IAutoMappingOverride<Person> {
        public void Override(FluentNHibernate.Automapping.AutoMapping<Funcionario> mapping)
        {
            mapping.Map(x => x.PhoneNumber).Nullable();
        }
    }
}

Ora ho bisogno di registrare la classe di override in Fluent NHibernate. Ho il seguente codice nella classe generica Web.Generics.GenericNHibernateRepository:

AutoMap.AssemblyOf<Person>()
  .Where(type => type.Namespace == "Entities")
  .UseOverridesFromAssemblyOf<PersonMappingOverride>();

Il problema è: UseOverridesFromAssemblyOf è un metodo generico, e non riesco a fare qualcosa di simile:

.UseOverridesFromAssemblyOf<PersonMappingOverride>();

Dato che causerebbe un riferimento circolare. Non voglio che il repository generico per conoscere il repository sia o la classe di mapping di override, perché variano da progetto a progetto.

vedo un'altra soluzione: nella classe GenericNHibernateRepository posso fare this.GetType () e ottenere il tipo di implementazione repository (ad es .: PersonRepository). Tuttavia non posso chiamare UseOverridesFromAssemblyOf() il superamento di un tipo.

C'è un altro modo per le sostituzioni di configurazione in FluentNHibernate? Se no, come potrei chiamare UseOverridesFromAssemblyOf<T> senza fare il repository generica dipendono dalla realizzazione repository o la classe di mapping di override?

(Fonte: http://wiki.fluentnhibernate.org/Auto_mapping#Overrides )

È stato utile?

Soluzione

Ecco il modo in cui lo faccio (fonte sopra su http://github.com/ToJans/MVCExtensions/blob/master/src/MvcExtensions/Services/Impl/FluentNHibernate/Database.cs )

    am1.GetType()
   .GetMethod("UseOverridesFromAssemblyOf")
   .MakeGenericMethod(mappings.GetType())
   .Invoke(am1,null);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top