2

У меня есть класс Service, который подключается к базе данных и извлекает данные. Новое требование заключается в том, что я подключаюсь ко второй (или N) базе данных с той же схемой и вытаскиваю данные таким же образом. (Каждая БД имеет разные записи, настраиваясь на региональном уровне).Замок Виндзор: для N строк зарегистрируйте N экземпляров класса и передайте строки [n] на ctor

Я хотел бы повторно использовать класс Service и просто передать строку подключения к сервису. (Строка подключения в настоящее время находится в App.config).

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

Возможно ли это в замке Виндзор?

Мой лучший вариант прямо сейчас:

public class ServiceInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     foreach (var connection in Properties.Settings.Default.ServicedDBs) 
     { 
      container.Register(
       Component.For<IService>() 
       .Named(connection) 
       .UsingFactoryMethod(() => new Service(
        container.Resolve<ILog>(), 
        connection))); 
     } 
    } 
} 
+0

BTW - Я вижу, что вы вставляете регистратор в конструктор. По-моему, это слабая зависимость и лучше всего подходит для инъекции через свойство, а не для конструктора. –

ответ

2

Это возможно. Реализуйте службу, чтобы иметь конструктор, который запрашивает строку соединения:

public interface IService { } 
public class Service : IService 
{ 
    public Service(string connectionString) 
    { 
     ConnectionString = connectionString; 
    } 
    public string ConnectionString { get; set; } 
} 

, а затем при регистрации компонента используют .DependsOn указание зависимостей:

public class ServiceInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     foreach (var connection in Properties.Settings.Default.ServicedDBs) 
     { 
      container.Register(
       Component.For<IService>() 
         .ImplementedBy<Service>() 
         .DependsOn(Dependency.OnValue("connectionString", connection) 
         .Named(connection))); 
     } 
    } 
} 

Вы также можете иметь его как свойство и использовать свойство Injection, чтобы установить его, но, на мой взгляд, это привязка зависимостей для конструктора. Более подробно об этом читайте: Dependency injection through constructors or property setters?


Был когда-то ссылку на SO Документация по .DependsOn теме, но это не было частью последней версии документации, которая была в целом видно. Ссылка была удалена как часть процесса очистки.

+0

Фантастический! Спасибо. – pomeroy

+0

@pomeroy - приветствую :) –