Можно ли назвать зависимость с StructureMap? - PullRequest
1 голос
/ 19 июля 2010

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

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

псевдо:

public class MyServiceClass
     string connectionString;

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

     public void DeleteObject
          var db = new EntitiesObject(connectionString)

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

РЕДАКТИРОВАТЬ: Я мог бы иметь несколько строк подключения, которые определяются во время выполнения из базы данных конфигурации.

РЕДАКТИРОВАТЬ: Одно решение, о котором я подумал, - это создать класс ThisDatabaseConnectionString и ThatDatabaseConnectionString ... таким образом, он может внедрить строку подключения на основе типа

1 Ответ

1 голос
/ 19 июля 2010

Вы можете сделать это (при условии, что 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")));
...