FluentNHibernate Переопределения: UseOverridesFromAssemblyOf неуниверсальной версии - PullRequest
2 голосов
/ 02 апреля 2010

У меня есть класс репозитория, который наследуется от универсальной реализации:

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

Общая реализация репозитория использует соглашения Fluent NHibernate. Они работают нормально. Одно из таких соглашений заключается в том, что все свойства не могут иметь значение 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 я могу сделать это. GetType () и получить тип реализации репозитория (например, PersonRepository). Однако я не могу позвонить UseOverridesFromAssemblyOf(), передавая тип.

Есть ли другой способ настройки переопределений в FluentNHibernate? Если нет, то как я мог бы вызвать UseOverridesFromAssemblyOf<T> без зависимости общего хранилища от реализации хранилища или класса переопределения сопоставления?

(Источник: http://wiki.fluentnhibernate.org/Auto_mapping#Overrides)

1 Ответ

2 голосов
/ 13 апреля 2010

Вот как я это делаю (источник включен http://github.com/ToJans/MVCExtensions/blob/master/src/MvcExtensions/Services/Impl/FluentNHibernate/Database.cs)

    am1.GetType()
   .GetMethod("UseOverridesFromAssemblyOf")
   .MakeGenericMethod(mappings.GetType())
   .Invoke(am1,null);
...