IWindsorInstaller в сборке и разрешении локальных зависимостей - PullRequest
1 голос
/ 04 октября 2011

У меня есть приложение WPF MVVM, в котором есть сборка модели и служб. Я пытаюсь выяснить, как использовать контейнер Windsor для разрешения локальных (сервисы на уровне сервиса) зависимостей, но единственное, что я могу выяснить, - это глупость и неправильность.

Услуги установщика:

public class ServicesInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        //Services
        container.Register(
            Component.For<IServiceA>().ImplementedBy<ServiceA>().LifeStyle.Singleton,
            Component.For<IServiceB>().ImplementedBy<ServiceB>().LifeStyle.Singleton
    }
}

Потребитель услуг (находится в сфере услуг):

public class ServiceConsumer
{
     public SomeMethodThatUsesServiceAOnlyOcassionally()
     {
         //buncha logic.
         if (allThatFailed)
         {
                 ??? ResolveServiceA ???
         }
     }
} 

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

1 Ответ

1 голос
/ 04 октября 2011

То, что вы хотите, это обычные шаблоны DI.

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

В вашем случае, однако, ServiceA зарегистрирован как одноэлементный, поэтому он создается только один раз за время существования приложения.Другими словами, нет никакой причины использовать прокси, и поскольку ваш сервис не может жить без него, вы должны просто использовать внедрение конструктора, потому что это ясно говорит о том, что IServiceA является обязательной зависимостью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...