Помогите с настройкой структуры карты - PullRequest
0 голосов
/ 16 мая 2011

Я пытаюсь настроить Structuremap что-то вроде следующего, но мне может показаться, что это правильно

ObjectFactory.Initialize(x => {

    x.For<TunaRepository>()
        .Use(new TunaRepository(serviceEndpoint))
        .Named("Tuna");

    x.For<CodRepository>()
        .Use(new CodRepository(serviceEndpoint))
        .Named("Cod");

    x.For<HaddockRepository>()
        .Use(new HaddockRepository(serviceEndpoint))
        .Named("Haddock");

    x.For<IFishRepository>().AddInstances(y =>
                                        {
                                            y.OfConcreteType<TunaRepository>().
                                            // Somehow add all instances here???

                                        });

    x.For<TunaController>().Use<TunaController>()
        .Ctor<IFishRepository>("repo").Is<TunaRepository>(); // This Is should use the instance registered above

    x.For<CodController>().Use<CodController>()
        .Ctor<IFishRepository>("repo").???

    x.For<HaddockController>().Use<HaddockController>()
        .Ctor<IFishRepository>("repo").???

});

В пунктах моего кода я хочу иметь возможность:

var instances = ObjectFactory.GetAllInstances<IFishRepository>();

, а также:

var instance = ObjectFactory.GetNamedInstance<IFishRepository>("Cod");

, а также использовать IFishRepository в качестве аргумента для моих контроллеров:

public TunaController(IFishRepository repo ...

Итак, мой вопрос, каков наилучший способ настройки моей ObjectFactory?

1 Ответ

0 голосов
/ 17 мая 2011

При регистрации именованных экземпляров, которые не должны быть экземпляром по умолчанию, вы используете метод Add:

 x.For<IFishRepository>()
   .Add(() => new TunaRepository(serviceEndpoint))
   .Named("Tuna");

Также обратите внимание, что если вы не хотите, чтобы TunaRepository был Singleton, вы должны зарегистрировать его с помощью лямбды. Лямбда будет оцениваться при запросе экземпляра и в моем примере будет возвращать новый экземпляр. Следите также за serviceEndpoint и убедитесь, что вам нужен этот единственный экземпляр для всех репозиториев. Обычно я склоняюсь к тому, чтобы связать все мои зависимости, используя For <> (). Используйте <> () в структурной карте, где это возможно, вместо использования «new». Это делает архитектуру намного более гибкой, тем более что вы можете добавлять новые параметры в ctors без изменения регистраций.

Для указания именованного экземпляра, который будет использоваться в конструкторе, вы можете использовать этот синтаксис:

 x.For<TunaController>().Use<TunaController>().
   Ctor<IFishRepository>("repo").
   Is(i => i.TheInstanceNamed("Tuna")); 

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

...