Регистрация быстрых отображений nhibernate для всех сборок в приложении - PullRequest
2 голосов
/ 24 августа 2010

Начиная с некоторого кода:

sessionFactory = Fluently.Configure(cfg)
                .Mappings(m => 
                {
                    List<Assembly> allAssemblies = new List<Assembly>();
                    string path = Assembly.GetExecutingAssembly().Location;
                    foreach (string dll in Directory.GetFiles(path, "*.dll"))
                    {
                        m.FluentMappings.AddFromAssembly(Assembly.LoadFile(dll));
                    }
                })
                .BuildSessionFactory();

Я очень новичок как в nhibernate, так и в беглом nhibernate.Вышеприведенный фрагмент кода выглядит так, как будто он должен работать, но для меня это выглядит ужасно.Есть ли более аккуратный способ?

Одна проблема, с которой я столкнулся, состоит в том, что код, вызывающий вышеуказанный код, находится в сборке ядра и не может ссылаться на некоторые сборки, для которых требуется сопоставление, поскольку их сборки ссылаются на ядросборка.Так что я не могу просто использовать несколько звонков на AddFromAssemblyOf<T>.

Есть ли более чистый способ сделать это?

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

Вы должны управлять инициализацией SessionFactory из самого приложения, чтобы ваш оригинальный код работал просто отлично.

Я справляюсь с этим, создавая базовый класс конфигурации NH, который делает то, что вы изначально пытались сделать. Затем я передаю это в мое приложение и выполняю там все начальные загрузки.

1 голос
/ 24 августа 2010

Вы можете создать пользовательский узел конфигурации для размещения в ваших файлах конфигурации.

У вас будет что-то вроде следующего:

<configSections>
    <section name="fluentConfigurationsSection" type="MyCoreAssembly.FluentConfigurationsSection, MyCoreAssembly"/>
</configSections>

<fluentConfigurationsSection>
    <fluentConfigurations>
      <clear />
      <add name="Assembly1" assembly="MyAssemblyNotReferencedByCoreAssembly.Mapping.Fluent"
      <add name="Assembly2" assembly="AnotherAssemblyNotReferencedByCoreAssembly.Mapping.Fluent"
      <add name="Assembly3" assembly="OneMoreAssemblyNotReferencedByCoreAssembly.Mapping.Fluent"
    </fluentConfigurations>
</fluentConfigurationsSection>

Тогда ваш код может быть изменен на что-то вроде:

sessionFactory = Fluently.Configure(cfg)
            .Mappings(m => 
            {
                foreach(var config in MethodToGetFluentConfigSectionItems())
                {
                    //load each assembly in config file
                    m.FluentMappings.AddFromAssembly(Assembly.Load(config.Assembly); 
                }
            })
            .BuildSessionFactory();

Чтобы создать пользовательский раздел конфигурации, вы можете увидеть здесь как это сделать.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...