我有一个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,所以我不希望通过构造函数注入或属性注入传递它。我会向安装程序添加一个静态容器实例,但我不得不相信有一个更惯用的解决方案。
答案 0 :(得分:1)
你想要的是常见的DI模式。
如果您的服务具有可选的依赖项(换句话说,它可以在没有依赖项的情况下执行其操作),则应使用属性注入。如果您的服务需要依赖项才能正常工作,那么您应该使用构造函数注入(因为它是必需的依赖项)。但是,如果创建该服务非常耗时,则应该将该依赖项隐藏在代理之后,这可能会在第一次调用代理时懒惰地创建该依赖项。
但是,在您的情况下,ServiceA
被注册为单身,因此它仅在应用程序的生命周期内创建一次。换句话说,没有理由使用代理,因为你的服务不能没有它,你应该只使用构造函数注入,因为这清楚地表明IServiceA
是必需的依赖。