2015-01-29 3 views
1

У меня есть следующий класс.Замок Windsor Установщики с параметрами конструктора

public class NHibernateInstaller : IWindsorInstaller 
{ 
    private string _overrideConnectionstring; 
    private IPersistenceConfigurer _persistenceConfigurer; 
    private static IPersistenceConfigurer _defaultConfiguration; 

    public IPersistenceConfigurer PersistenceConfigurer 
    { 
     get 
     { 
      return _persistenceConfigurer ?? (_persistenceConfigurer = MsSqlConfiguration.MsSql2008 
       .ConnectionString(Config.DefaultConnection)); 
     } 
     protected set 
     { 
      if (value == null) 
      { 
       throw new ArgumentNullException("value"); 
      } 
      if (_persistenceConfigurer != null) 
      { 
       throw new InvalidOperationException("Property has already been set"); 
      } 
      _persistenceConfigurer = value; 
     } 
    } 

    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     var fluentConfiguration = Fluently.Configure() 
      .Mappings(m => 
      { 
       var autoPersistenceModel = AutoMap.AssemblyOf<Log>() 
        .UseOverridesFromAssemblyOf<LogMappingOverride>()       
        .Where(t => t != typeof(SomeNonEntity)); 
       m.AutoMappings.Add(autoPersistenceModel); 
      }); 

     fluentConfiguration.Database(PersistenceConfigurer); 

     var sessionFactory = fluentConfiguration.BuildSessionFactory(); 

     container.Register(Component.For<ISessionFactory>() 
      .Instance(sessionFactory) 
      .LifestyleSingleton()); 

     container.Register(Component.For<ISession>() 
      .UsingFactory((ISessionFactory factory) => sessionFactory.OpenSession()) 
      .LifestylePerWebRequest()); 
    } 
} 

Я добавил свойство, которое позволяет мне изменить persistenceconfigurer так, что я могу изменить это при тестировании. В настоящий момент по умолчанию persistenceconfigurer предназначен для получения строки соединения из общедоступного статического метода, который завершает вызов ConfigurationManager. Я хочу использовать адаптер словаря замка, чтобы получить свой appSettings и т. Д., И хотел бы знать, как наилучшим образом ввести строку подключения по умолчанию в Connection NHibernateInstaller.

Я знаю, что для документации для инсталляторов требуется публичный конструктор по умолчанию.

Любые предложения были бы замечательными.

ответ

2

документы говорят:

«Когда монтажники инстанцируются по Виндзор, они должны иметь конструктор по умолчанию общественного», то есть при использовании InstallerFactory или FromAssembly, чтобы загрузить их.

При добавлении (или добавить) монтажников в контейнер вручную, то конструктор по умолчанию не требуется, так что это должно передать строку соединения конструктору, где он может храниться в поле:

container.Install(new NHibernateInstaller(defaultConnectionString)) 
+0

Спасибо @stuartd, это в значительной степени то, что я сделал. Другие варианты - изменить мой NHibernateInstaller для внутренней установки, как указано выше, и установить другие установщики с помощью функции FromAssembly. Это означало бы, что мне нужно было бы установить внутренние видимости на моем модульном тестовом классе. – Andrew

+0

@ Вы можете использовать пользовательский установщик InstallerFactory и установить его для игнорирования этого конкретного установщика, есть пример на http://stackoverflow.com/a/9084690/43846 – stuartd

+0

Спасибо за предложение, это выглядит хорошо. – Andrew

Смежные вопросы