IWindsorInstaller在程序集中并解析本地依赖项

时间:2011-10-04 14:13:44

标签: c# dependency-injection castle-windsor

我有一个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 个答案:

答案 0 :(得分:1)

你想要的是常见的DI模式。

如果您的服务具有可选的依赖项(换句话说,它可以在没有依赖项的情况下执行其操作),则应使用属性注入。如果您的服务需要依赖项才能正常工作,那么您应该使用构造函数注入(因为它是必需的依赖项)。但是,如果创建该服务非常耗时,则应该将该依赖项隐藏在代理之后,这可能会在第一次调用代理时懒惰地创建该依赖项。

但是,在您的情况下,ServiceA被注册为单身,因此它仅在应用程序的生命周期内创建一次。换句话说,没有理由使用代理,因为你的服务不能没有它,你应该只使用构造函数注入,因为这清楚地表明IServiceA是必需的依赖。