C# 将DI与facade一起使用
虽然我不认为这是一个重复的问题,但这个问题的变体已经被提出,并且在较小的程度上。我有一个类似于第一个链接中提出的问题的场景:我有一个使用DI的核心库。对于许多类,我的期望是调用应用程序将提供这些类所期望的接口的实现,因此可以合理地假设调用应用程序将正确地设置它们的容器(如果有的话) 我遇到的问题是我设置了几个正面。这些外观所依赖的接口是在我的库中实现的,它们不应该由调用应用程序提供。在第一个链接中,Mark Seemann建议如果API对于新手用户来说太复杂,则使用高度可发现的外观来封装依赖项组合。虽然我不认为API有任何过于复杂的地方,但我的目标是让调用应用程序能够执行类似的操作(理解小部件具有内部依赖性): 如果我按照Mark关于facade的想法运行,以返回C# 将DI与facade一起使用,c#,.net,dependency-injection,inversion-of-control,C#,.net,Dependency Injection,Inversion Of Control,虽然我不认为这是一个重复的问题,但这个问题的变体已经被提出,并且在较小的程度上。我有一个类似于第一个链接中提出的问题的场景:我有一个使用DI的核心库。对于许多类,我的期望是调用应用程序将提供这些类所期望的接口的实现,因此可以合理地假设调用应用程序将正确地设置它们的容器(如果有的话) 我遇到的问题是我设置了几个正面。这些外观所依赖的接口是在我的库中实现的,它们不应该由调用应用程序提供。在第一个链接中,Mark Seemann建议如果API对于新手用户来说太复杂,则使用高度可发现的外观来封装依赖项组
Widget
期望的实现,我的Widget
实现可能如下所示:
public class Widget()
{
public Widget() : this(DependencyFacade.SystemOneDep()) { }
internal Widget(ISystemOne sysOne)
{
//Do work
}
}
其中,SystemOneDep()
调用只返回ISystemOne
的实现。当然,这是可行的,但(我可能想得太多了)这对我来说有点异味,因为我现在耦合到DependencyFacade类(在内部,DependencyFacade可能正在调用工厂,实际返回实例,而不是简单地在facade中更新对象)。可以理解,在某些时候,需要了解接口的具体实现,并将其提供给消费者,因此这可能是正确的方法
这里真正的问题是:是否存在更好的方法来实现预期的结果,或者使用门面是实现结果的“最佳”方法 首先,链接facade和类本身是分开的。Facade创建小部件(在您的例子中),您不需要以任何方式更改小部件类的实现。这是一个好的观点,我没有从这个角度来看待它。因此,正如您当时看到的,您没有耦合到DependencyFacade类,您对这个方法还有其他担心吗?
public class Widget()
{
public Widget() : this(DependencyFacade.SystemOneDep()) { }
internal Widget(ISystemOne sysOne)
{
//Do work
}
}