【发布时间】:2013-07-21 19:35:30
【问题描述】:
假设我的客户端应用中有一个名为 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(); ... } }
【问题讨论】:
-
解决方案已经够了;您正在解决的业务问题是什么?解决方案的选择取决于它要解决的问题。
-
因为第三个选项...,我的一部分想要对此投反对票
-
我只使用构造函数 DI(Autofac 运行良好),其余的不用担心。使用像 Autofac 这样的容器可以让我简单地控制高级生命周期并处理依赖关系图而无需很多工作。现在,如果
client依赖于方法调用本身的某些东西,我可能会使用 Autofac“函数”(实际上是一个隐式工厂)方法.. -
请记住,根据服务对象是按调用还是按会话创建的,方法 1 和 2 可能具有不同的语义。
-
如果他们不这样做,因为服务是无状态的:掷硬币选择哪个。看到他们做同样的事情,这是自行车棚的论据材料。