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

时间:2013-07-22 22:01:54

标签: c# .net wcf oop

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

3 个答案:

答案 0 :(得分:8)

当你依赖于这样的另一个类时,通常最好将它的构造分开并传入(或者可能使用依赖注入)。这使您的DataService类更容易测试,您可以更轻松地以这种方式模拟WebServiceClient。

考虑类似......

public class DataService
{

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

}

答案 1 :(得分:1)

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

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();

            ...
        }
    }

答案 2 :(得分:0)

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

public class DataService
{
    MyWebServiceClient client;

    public void Method1()
    {
        var v = client.Operation1();

        ...
    }

    public void Method2()
    {
        var v = client.Operation2();

        ...
    }
}