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