我在实现和使用 WCF 服务方面有点陌生,在 DI 方面非常陌生(而且显然一无所知)。
我有具有构造函数的 WCF 服务。构造函数的参数只能在运行时来自客户端应用程序(Web 服务器)。 像这样:
在应用服务器中:
public class MyService : IMyService {
private IUserContext userContext;
public MyService(IUserContext uContext) {
this.userContext = uContext;
}
public DoWork() {
... // uses uContext
}
}
在 Web 服务器中只能看到 IMyService 而看不到 MyService 的实现。代码将是这样的(过度简化的控制台应用程序):
class Program {
static void Main(string[] args) {
var factory = new ChannelFactory<IMyService>("MyServiceEndpoint"); // MyServiceEndpoint correctly defined in config file
var client = factory.CreateChannel();
client.DoWork();
((IClientChannel)client).Close();
factory.Close();
}
}
首先 WCF“强制”我在 MyService
的实现中使用无参数构造函数以测试它 我通过初始化 UserContext
对象添加了它。当然,我没有必要的信息来在编译时创建对象,所以这对我没有帮助。
我继续使用 this创建我自己的 ServiceHostFactory
、ServiceHost
和 IInstanceProvider
的解决方案,其中 IDependency
是一个接口(interface) IUserContext
这是由我的 UserContext
类实现的。
这按预期工作,我在我的 svc 文件中注册了自定义工厂,我不再需要无参数构造函数。但是,由于我不知道如何将我的 UserContext
传递给 InstanceProvider
,我只能得到一个默认的 UserContext
对象。
现在小白进来了,不知道如何调用 MyService
传入 UserContext
位于网络服务器中。我还需要自己的 ChannelFactory
吗?
有人可以通过更新网络服务器虚拟代码以正确的方式指导我吗?
谢谢!
备注:我不希望 UserContext 成为 DoWork()
方法的参数,因为那意味着更改我所有服务和所有调用的参数列表...
最佳答案
在线路上不存在构造函数的概念(无论您使用何种传输方式)。因此,您将永远无法让客户端调用特定的构造函数。这根本不是 WCF 设计的一部分(也不是 SOAP 的一部分)。
不要使用客户端提供的构造函数参数。或者,使服务类具有无参数构造函数,并使所有服务方法接受前构造函数参数作为普通参数。
您还可以将公共(public)参数作为 SOAP header 传输。这样可以避免更改所有服务方法的签名。
关于c# - 如何使用我的 InstanceProvider 使用自己的构造函数调用 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31558321/