更好的做法是,为类提供一个客户端实例,或者在每个方法中提供一个

本文关键字:一个 或者 实例 方法 客户端 更好 | 更新日期: 2023-09-27 18:24:36

假设我的客户端应用程序中有一个名为DataService的类。这个类有许多方法可以调用WCF服务。

我想知道哪种做法更好:

  1. 在类中创建WebServiceClient的实例,该实例在创建类的实例时初始化,并由方法使用,例如:

    public class DataService
    {
        MyWebServiceClient client = new MyWebServiceClient();
        public void Method1()
        {
            var v = client.Operation1();
            ...
        }
        public void Method2()
        {
            var v = client.Operation2();
            ...
        }
    }
    
  2. 或者,在类的每个方法中创建并初始化WebServiceClient的实例,例如:

    public class DataService
    {      
        public void Method1()
        {
            var client = new MyWebServiceClient();
            var v = client.Operation1();
            ...
        }
        public void Method2()
        {
            var client = new MyWebServiceClient();
            var v = client.Operation2();
            ...
        }
    }
    
  3. 还有第三种选择,即在类中声明并在每个方法中初始化:

    public class DataService
    {
        MyWebServiceClient client;
        public void Method1()
        {
            client = new MyWebServiceClient();
            var v = client.Operation1();
            ...
        }
        public void Method2()
        {
            client = new MyWebServiceClient();
            var v = client.Operation2();
            ...
        }
    }
    

更好的做法是,为类提供一个客户端实例,或者在每个方法中提供一个

当您对另一个类有这样的依赖时,通常最好将其构造分离出来并传入(或者可能使用依赖注入)。这使您的DataService类更容易测试,您可以更容易地通过这种方式模拟WebServiceClient。

考虑一下。。。

public class DataService
{
    public DataService(MyWebServiceClient client)
    {
        .... //Assign it to a private var...
    }
}

我会使用构造函数注入和每个类一个实例,如下所示:

public class DataService
    {
        IMyWebServiceClient _client;
         public  DataService(IMyWebServiceClient client)
          {
           _client=client
           }
          public  DataService():this(new MyWebServiceClient())
           {
           }

        public void Method1()
        {
            var v = _client.Operation1();
            ...
        }
        public void Method2()
        {
            var v = _client.Operation2();
            ...
        }
    }

我在较旧的应用程序中最常使用方法3。但最近看到一些代码,其中有对象声明,但实例化是由Spring之类的框架完成的。实例保存在容器中。但仍在学习这个过程。

public class DataService
{
    MyWebServiceClient client;
    public void Method1()
    {
        var v = client.Operation1();
        ...
    }
    public void Method2()
    {
        var v = client.Operation2();
        ...
    }
}
相关文章: