Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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# 包含两个内部服务和依赖项注入的Facade-设计模式方法_C#_Design Patterns_Dependency Injection_Facade_Proxy Pattern - Fatal编程技术网

C# 包含两个内部服务和依赖项注入的Facade-设计模式方法

C# 包含两个内部服务和依赖项注入的Facade-设计模式方法,c#,design-patterns,dependency-injection,facade,proxy-pattern,C#,Design Patterns,Dependency Injection,Facade,Proxy Pattern,我想创建Facade类来处理两个服务上的一些操作。 为了联系这些服务,我有代理类 每个服务都有抽象代理和派生代理-如何创建架构的这一部分,以避免在Facade中解析 class Facade { private Proxy proxy1; private Proxy proxy2; public Facade() { //I don't like this part proxy1 = ...Resolve<Proxy1Typ

我想创建Facade类来处理两个服务上的一些操作。 为了联系这些服务,我有代理类

每个服务都有抽象代理和派生代理-如何创建架构的这一部分,以避免在Facade中解析

class Facade
{
    private Proxy proxy1;
    private Proxy proxy2;

    public Facade()
    {
        //I don't like this part
        proxy1 = ...Resolve<Proxy1Type>();
        proxy2 = ...Resolve<Proxy2Type>();
    }


    public void Do()
    {
        proxy1.Call();
        proxy2.Call();
    }
}

    abstract class Proxy {public void Call();}
    class Proxy1Type : Proxy {public void override Call(){}}
    class Proxy2Type : Proxy {public void override Call(){}}

有两种相反的方法,您在问题中展示了这两种方法。您可以使用(第一个示例)解析类内部的依赖项,也可以使用从外部注入依赖项

依赖项注入(在您的案例中)有几个优点:

  • 更清楚的是,
    Facade
    类需要什么才能正常运行,因为您不需要在类内部挖掘来确定它将尝试解决什么问题(以及何时解决)
  • 单元测试
    Facade
    类更容易,因为您可以通过构造函数注入测试双倍体;不需要在单元测试中配置DI容器
  • 您可以在中阅读有关服务定位器(以及为什么应该避免使用它)的更多信息

    class Facade
    {
        private IProxy proxy1;
        private IProxy proxy2;
    
        //I feel it's still wrong
        public Facade(IProxy1Type p1, IProxy2Type p2)
        {
            proxy1 = p1;
            proxy2 = p2;
        }
    
    
        public void Do()
        {
            proxy1.Call();
            proxy2.Call();
        }
    }
    interface IProxy { void Call();}
    interface IProxy1Type : IProxy{}
    interface IProxy2Type : IProxy {}
    class Proxy1Type : IProxy1Type { public void Call() { } }
    class Proxy2Type : IProxy2Type { public void Call() { } }