Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DI与facade一起使用_C#_.net_Dependency Injection_Inversion Of Control - Fatal编程技术网

C# 将DI与facade一起使用

C# 将DI与facade一起使用,c#,.net,dependency-injection,inversion-of-control,C#,.net,Dependency Injection,Inversion Of Control,虽然我不认为这是一个重复的问题,但这个问题的变体已经被提出,并且在较小的程度上。我有一个类似于第一个链接中提出的问题的场景:我有一个使用DI的核心库。对于许多类,我的期望是调用应用程序将提供这些类所期望的接口的实现,因此可以合理地假设调用应用程序将正确地设置它们的容器(如果有的话) 我遇到的问题是我设置了几个正面。这些外观所依赖的接口是在我的库中实现的,它们不应该由调用应用程序提供。在第一个链接中,Mark Seemann建议如果API对于新手用户来说太复杂,则使用高度可发现的外观来封装依赖项组

虽然我不认为这是一个重复的问题,但这个问题的变体已经被提出,并且在较小的程度上。我有一个类似于第一个链接中提出的问题的场景:我有一个使用DI的核心库。对于许多类,我的期望是调用应用程序将提供这些类所期望的接口的实现,因此可以合理地假设调用应用程序将正确地设置它们的容器(如果有的话)

我遇到的问题是我设置了几个正面。这些外观所依赖的接口是在我的库中实现的,它们不应该由调用应用程序提供。在第一个链接中,Mark Seemann建议如果API对于新手用户来说太复杂,则使用高度可发现的外观来封装依赖项组合。虽然我不认为API有任何过于复杂的地方,但我的目标是让调用应用程序能够执行类似的操作(理解小部件具有内部依赖性):

如果我按照Mark关于facade的想法运行,以返回
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
    }
}