更好的做法是,为类提供一个客户端实例,或者在每个方法中提供一个
本文关键字:一个 或者 实例 方法 客户端 更好 | 更新日期: 2023-09-27 18:24:36
假设我的客户端应用程序中有一个名为DataService
的类。这个类有许多方法可以调用WCF服务。
我想知道哪种做法更好:
-
在类中创建WebServiceClient的实例,该实例在创建类的实例时初始化,并由方法使用,例如:
public class DataService { MyWebServiceClient client = new MyWebServiceClient(); public void Method1() { var v = client.Operation1(); ... } public void Method2() { var v = client.Operation2(); ... } }
-
或者,在类的每个方法中创建并初始化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(); ... } }
-
还有第三种选择,即在类中声明并在每个方法中初始化:
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();
...
}
}