StructureMap: как правильно установить зависимости по умолчанию - PullRequest
2 голосов
/ 21 июля 2011

Подход, который мы недавно использовали, состоит в том, чтобы включать реестр StructureMap в каждую из наших сборок, которые устанавливают зависимости по умолчанию.

Для этого мы используем сканер:

        cfg.Scan(scanner =>
        {
            scanner.TheCallingAssembly();
            scanner.Assembly("Assembly1");
            scanner.Assembly("Assembly2");
            scanner.Assembly("Assembly3");

            scanner.LookForRegistries();
        });

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

Вопрос в том, где мы должны зарегистрировать эти переопределения?то есть, прежде чем мы сканируем ?, после того, как мы сканируем?

Кроме того, влияет ли порядок сборок, указанный в выражении сканирования, на порядок, в котором регистрируются зависимости.Таким образом, в приведенном выше примере, будут ли регистры, содержащиеся в основном приложении (TheCallingAssembly), переопределяться теми, которые находятся в "Assembly3"?

Большое спасибо
Ben

1 Ответ

4 голосов
/ 14 августа 2011

Реестры в TheCallingAssembly будут переопределены теми, которые вы зарегистрировали в Assembly1, 2 и т. Д.

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

container.GetAllInstances<ISomeInterface>();

Это вернет IList всех зарегистрированных ISomeInterface в Structuremap.

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

В этом примере по умолчанию используется ISomeInterface, зарегистрированный в Assembly1. Когда вы смотрите на код, можно поверить, что SomeOtherClass используется по умолчанию. Но на самом деле именно тот, который зарегистрирован в Assembly1, является значением по умолчанию.

var container = new Container(x => {
            x.Scan(scanner =>
            {
                scanner.TheCallingAssembly();
                scanner.Assembly("Assembly1");

                scanner.LookForRegistries();
            });

            x.For<ISomeInterface>().Use<SomeOtherClass>();
        });

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

var container = new Container(x => {
            x.Scan(scanner =>
            {
                scanner.TheCallingAssembly();
                scanner.Assembly("Assembly1");

                scanner.LookForRegistries();
            });
        });

container.Configure(x => x.For<ISomeInterface>().Use<SomeOtherClass>());
...