Question

J'ai une classe de référentiel qui hérite d'une implémentation générique:

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

La mise en œuvre du référentiel générique utilise les conventions Fluent NHibernate. Ils travaillent bien. L'une de ces conventions est que toutes les propriétés ne sont pas annulable.

Maintenant je dois définir que les propriétés spécifiques peuvent être annulable en dehors des conventions. Fluent NHibernate a un mécanisme de remplacement intéressant:

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

Maintenant je dois enregistrer la classe de priorité dans Fluent NHibernate. J'ai le code suivant dans la classe générique Web.Generics.GenericNHibernateRepository:

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

Le problème est: UseOverridesFromAssemblyOf est une méthode générique, et je ne peux pas faire quelque chose comme ça:

.UseOverridesFromAssemblyOf<PersonMappingOverride>();

Parce que causerait une référence circulaire. Je ne veux pas que le référentiel générique de connaître l'une ou l'autre référentiel ou la classe de priorité de la cartographie, car ils varient d'un projet à.

Je vois une autre solution: dans la classe GenericNHibernateRepository je peux faire this.GetType () et obtenir le type de mise en œuvre du référentiel (par exemple .: PersonRepository). Cependant, je ne peux pas appeler UseOverridesFromAssemblyOf() passer un type.

Y at-il une autre façon de configurer Remplacements dans FluentNHibernate? Sinon, comment pourrais-je appeler UseOverridesFromAssemblyOf<T> sans faire le dépôt générique dépend de la mise en œuvre du référentiel ou la classe de priorité de mise en correspondance?

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

Était-ce utile?

La solution

Voici la façon dont je le fais (source sur le http://github.com/ToJans/MVCExtensions/blob/master/src/MvcExtensions/Services/Impl/FluentNHibernate/Database.cs )

    am1.GetType()
   .GetMethod("UseOverridesFromAssemblyOf")
   .MakeGenericMethod(mappings.GetType())
   .Invoke(am1,null);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top