繁体   English   中英

哪个更好的做法,一个客户端实例或每个方法一个?

[英]Which is better practice, one client instance for the class or one in each method?

假设我的客户端应用程序中有一个名为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();

        ...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM