2010-07-19 2 views
1

Я хотел бы иметь возможность вводить именованные зависимости в класс с использованием StructureMap, если это вообще возможно. Основная причина, по которой я хочу это сейчас, - это вставка строки подключения.Можно ли назвать зависимость с StructureMap?

Я могу делать это неправильный путь, но вот как я получил его (просто нужно добавить инъекции сейчас):

псевдо:

public class MyServiceClass 
    string connectionString; 

    public MyServiceClass(string connectionString) 
      this.connectionString = connectionString; 

    public void DeleteObject 
      var db = new EntitiesObject(connectionString) 

Есть ли способ, чтобы поставить имя в параметре конструктора строки соединения, чтобы StructureMap знал, как его вводить?

EDIT: Я мог бы иметь несколько строк соединения, которые определены во время выполнения из базы данных конфигурации.

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

ответ

1

Вы можете сделать это (при условии, что myConnectionString это экземпляр строки):

container.Configure(r => r 
    .ForConcreteType<MyServiceClass>() 
    .Configure.Ctor<string>().Is(myConnectionString)); 

Если вам также необходимо отобразить MyServiceClass из интерфейса (или абстрактный базовый класс), вы можете сделать это вместо того, чтобы:

container.Configure(r => r 
    .For<IServiceClass>() 
    .Use<MyServiceClass>() 
    .Ctor<string>().Is(myConnectionString)); 

Если вы настроены ранее названные строки соединения, сконфигурированные в контейнере, вы можете сделать что-то вроде этого:

container.Configure(r => r 
    .For<string>() 
    .Use("foo") 
    .Named("connStr1")); 
container.Configure(r => r 
    .For<string>() 
    .Use("bar") 
    .Named("connStr2")); 
container.Configure(r => r 
    .ForConcreteType<MyServiceClass>() 
    .Configure.Ctor<string>().Is((IContext ctx) => 
     ctx.GetInstance<string>("connStr2"))); 
+0

Может потенциально нужны две разные строки подключения (не вероятно, но это случается) .. Думаю, я, вероятно, пойду с идеей создания класса для каждой требуемой строки подключения. –

+0

Не могли бы вы просто выбрать подходящую строку подключения, как часть настройки вашего контейнера? –

+0

BTW, посмотрим, поможет ли мой обновленный ответ ... –

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