C# 如何使用我的InstanceProvider使用自己的构造函数调用WCF服务
在实现和使用WCF服务方面,我是一个新手,在DI方面,我是一个非常新的(而且显然是无知的) 我有WCF服务,其中有构造函数。构造函数的参数只能在运行时来自客户端应用程序(Web服务器)。 大概是这样的: 在应用程序服务器中:C# 如何使用我的InstanceProvider使用自己的构造函数调用WCF服务,c#,wcf,dependency-injection,C#,Wcf,Dependency Injection,在实现和使用WCF服务方面,我是一个新手,在DI方面,我是一个非常新的(而且显然是无知的) 我有WCF服务,其中有构造函数。构造函数的参数只能在运行时来自客户端应用程序(Web服务器)。 大概是这样的: 在应用程序服务器中: public class MyService : IMyService { private IUserContext userContext; public MyService(IUserContext uContext) { this.u
public class MyService : IMyService {
private IUserContext userContext;
public MyService(IUserContext uContext) {
this.userContext = uContext;
}
public DoWork() {
... // uses uContext
}
}
在Web服务器中,只能看到IMyService,而不能看到MyService的实现。代码如下(过于简化的控制台应用程序):
类程序{
静态void Main(字符串[]参数){
var factory=newchannelfactory(“MyServiceEndpoint”);//在配置文件中正确定义了MyServiceEndpoint
var client=factory.CreateChannel();
client.DoWork();
((IClientChannel)client.Close();
工厂关闭();
}
}
第一个WCF“强迫”我在MyService
的实现中使用无参数构造函数,为了测试它,我通过初始化UserContext
对象添加了该构造函数。当然,我没有必要的信息在编译时创建对象,所以这对我没有帮助
我继续使用解决方案创建我自己的ServiceHostFactory
,ServiceHost
和IInstanceProvider
,其中IDependency
是一个接口IUserContext
,由我的UserContext
类实现。
这就像预期的一样,我在我的svc文件中注册了自定义工厂,我不再需要无参数构造函数了。但是,由于我不知道如何将我的UserContext
传递给InstanceProvider
,因此我只得到一个默认的UserContext
对象
现在我是新手了。我不知道如何通过传入web服务器中的用户上下文来调用MyService。我是否也需要自己的通道工厂
?
有人可以通过更新web服务器虚拟代码来指导我吗?
谢谢
备注:我不希望UserContext成为
DoWork()
方法的参数,因为这意味着更改我所有服务和所有调用的参数列表…构造函数的概念在网络上不存在(无论您使用的是什么传输)。因此,您将永远无法使客户端调用特定的构造函数。这根本不是WCF设计的一部分(也不是SOAP的一部分)
不要使用客户端提供的构造函数参数。或者,使服务类具有一个无参数的构造函数,并使所有服务方法都接受前一个构造函数参数作为正常参数
您还可以将公共参数作为SOAP头进行传输。这样您就不用更改所有服务方法的签名了。谢谢您的回答!使用公共SOAP头可能是一个可行的选择。我可以序列化标头数据中的复杂对象吗?有尺寸限制吗?您还记得其他可能出现的问题吗?你能给我举个简单的例子吗?你可以转移复杂的物体,是的。我不知道有什么实际的限制是不能禁用的。我相信,当您搜索“wcf自定义头”或“wcf soap头对象”或其变体时,您可以找到示例。感谢您的帮助!可能与我在问题中所说的重复,我已经做了这些步骤。DI工作,并且使用了我的构造函数,但是我想使用客户端提供的参数。到目前为止,我还没有看到这样的例子。
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();
}
}