4

假设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();
    
            ...
        }
    }
    
4

3 回答 3

8

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

考虑类似...

public class DataService
{

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

}
于 2013-07-22T22:10:31.160 回答
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();

            ...
        }
    }
于 2013-07-22T22:12:13.677 回答
0

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

public class DataService
{
    MyWebServiceClient client;

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

        ...
    }

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

        ...
    }
}
于 2013-07-22T22:07:43.290 回答