Настройка Fluent NHibernate и NHibernate Validator - PullRequest
0 голосов
/ 24 августа 2011

Я изо всех сил пытаюсь заставить Fluent NHibernate и NHibernate Validator работать вместе, и в Интернете, похоже, отсутствует документация о том, как лучше всего это сделать.Я нашел несколько сайтов, которые подробно описывают, как настроить валидатор и NHibernate, но не Fluent NHibernate.Я понимаю, что Fluent NHibernate - это просто NHibernate с хорошими сопоставлениями, но я не могу полностью разобраться в конфигурации.

Это код, который я использую для настройки моего SessionFactory:

public static void Initialise()
{
    Configuration config =  Fluently.Configure()
                                      .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c
                                        .Server("")
                                        .Database("")
                                        .Username("")
                                        .Password("")))
                                      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Map>()
                                        .Conventions.AddFromAssemblyOf<EnumConvention>())
                                      .BuildConfiguration();

    DataBindingInterceptor interceptor = new DataBindingInterceptor();
    SessionFactory = config
                       .SetInterceptor(interceptor)
                       .BuildSessionFactory();

}

Из этого вопроса я пытался создать метод, который выглядел следующим образом, для настройки моего валидатора:

private static void ConfigureValidator(Configuration config)
{
    NHibernate.Validator.Cfg.Environment.SharedEngineProvider = new SharedValidatorProvider();
    var nhvc = new NHVConfiguration();
    nhvc.Properties[NHibernate.Validator.Cfg.Environment.ApplyToDDL] = "true";
    nhvc.Properties[NHibernate.Validator.Cfg.Environment.AutoregisterListeners] = "true";
    nhvc.Properties[NHibernate.Validator.Cfg.Environment.ValidatorMode] = "UseAttribute";

    var ve = new ValidatorEngine();
    ve.Configure(nhvc);
    ValidatorInitializer.Initialize(config, ve);
}

Однако я получил ошибки при попытке найти пространство имен для SharedValidatorProviderи NHVConfiguration.У меня есть Castle.Core, FluentNHibernate, NHibernate, NHibernate.ByteCode.Castle, NHibernate.Validator и NHibernate.Validator.Specific DLL, указанные в проекте и следующие using:

using NHibernate.Validator.Engine;
using NHibernate.Validator.Event;
using NHibernate.Validator.Cfg;
using NHibernate.Cfg;
using NHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;

Iбыл бы очень признателен за вашу помощь, чтобы Fluent NHibernate и NHibernate Validator счастливо работали вместе.Надеюсь, это станет окончательным источником, когда люди попытаются сделать это в будущем!

1 Ответ

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

Я думаю, что вы хотите NHibernateSharedEngineProvider и НЕ SharedValidatorProvider в вашем коде выше. Для использования NHibernateSharedEngineProvider необходимо следующее:

using NHibernate.Validator.Event;

NHVConfiguration - это переменная в том сообщении, на которую вы ссылаетесь, и НЕ тип. Я думаю, вам нужно внимательнее рассмотреть этот пост.

Также просто примечание. Если у вас возникнут проблемы с поиском типа, Object Browser в visual studio станет вашим другом. Он имеет возможность поиска по всем сборкам, включенным в ваш проект.

Редактировать:

Ниже то, что я сейчас делаю, изменило то, что вы хотите выше, но вместо этого настраивается NHV:

public static void Initialise()
{
    //Read the configuration from hibernate.xml.cfg or app.config
    private static NHibernate.Cfg.Configuration normalConfig = new NHibernate.Cfg.Configuration().Configure();

    ConfigureNhibernateValidator(normalConfig);

    Configuration config =  Fluently.Configure(normalConfig)
                                      .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c
                                        .Server("")
                                        .Database("")
                                        .Username("")
                                        .Password("")))
                                      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Map>()
                                        .Conventions.AddFromAssemblyOf<EnumConvention>())
                                      .BuildConfiguration();

    DataBindingInterceptor interceptor = new DataBindingInterceptor();
    SessionFactory = config
                       .SetInterceptor(interceptor)
                       .BuildSessionFactory();

}

    private static void ConfigureNhibernateValidator(NHibernate.Cfg.Configuration config)
    {
        var provider = new NHibernateSharedEngineProvider();
        NHibernate.Validator.Cfg.Environment.SharedEngineProvider = provider;

        var nhvConfiguration = new NHibernate.Validator.Cfg.Loquacious.FluentConfiguration();
        nhvConfiguration
           .SetDefaultValidatorMode(ValidatorMode.UseAttribute)
           .Register(Assembly.Load("Namespace.To.Business.Objects")
           .ValidationDefinitions())
           .IntegrateWithNHibernate
               .ApplyingDDLConstraints()
               .RegisteringListeners();

        ValidatorEngine validatorEngine = NHibernate.Validator.Cfg.Environment.SharedEngineProvider.GetEngine();
        validatorEngine.Configure(nhvConfiguration);

        ValidatorInitializer.Initialize(config, validatorEngine);
    }
...