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

C# IWindsorInstaller在程序集中并解析本地依赖项,c#,dependency-injection,castle-windsor,C#,Dependency Injection,Castle Windsor,我有一个WPF MVVM应用程序,它有一个模型和服务程序集。我正试图弄清楚如何使用Windsor容器来解决本地(服务层中的服务)依赖关系,但我唯一能弄清楚的是,这让人觉得很麻烦,而且不正确 服务安装程序: 公共类服务安装程序:IWindsorInstaller { public void安装(IWindsorContainer、IConfigurationStore) { //服务 集装箱。登记( Component.For().ImplementedBy().LifeStyle.Singlet

我有一个WPF MVVM应用程序,它有一个模型和服务程序集。我正试图弄清楚如何使用Windsor容器来解决本地(服务层中的服务)依赖关系,但我唯一能弄清楚的是,这让人觉得很麻烦,而且不正确

服务安装程序:

公共类服务安装程序:IWindsorInstaller
{
public void安装(IWindsorContainer、IConfigurationStore)
{
//服务
集装箱。登记(
Component.For().ImplementedBy().LifeStyle.Singleton,
Component.For().ImplementedBy().LifeStyle.Singleton
}
}
服务消费者(位于服务中):

公共类服务消费者
{
public SomeMethods偶尔使用服务()
{
//邦查逻辑。
如果(全部失败)
{
??解决方案A???
}
}
} 

因为我并不经常依赖ServiceA,所以我不想通过构造函数注入或属性注入来传递它。我会向安装程序添加一个静态容器实例,但我必须相信有一个比这更惯用的解决方案。

对于您想要的是通用DI模式

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


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

您需要的是通用DI模式

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


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

那么就没有理由通过编程来解析类型(除了初始化/连接)?@Ritch:如果您手动调用容器(在应用程序逻辑内部)解析一个实例?不,永远不会!这会导致。好吧,服务定位器是我的习惯。我知道,但它很容易默认为旧思维。那么就没有理由以编程方式解析类型(除了初始化/连接)?@Ritch:如果你手动调用容器(在应用程序逻辑内部)解决一个实例?不,永远不会!那会导致。好吧,服务定位器是我的习惯。我明白,但很容易默认为旧思维。