我在DI中实现和使用WCF服务以及非常新的(显然是无能为力的)是新的。
我有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
是一个接口IUserContext
,已实施我的UserContext
课程。
这按预期工作,我在我的svc文件中注册了自定义工厂,我不再需要无参数构造函数。但是,由于我不知道如何将UserContext
传递给InstanceProvider
我只能获得默认的UserContext
对象。
现在我的新手进来。我不知道如何调用 MyService
传入 {{1它存在于Web服务器中。我还需要自己UserContext
吗?
有人可以通过更新Web服务器虚拟代码以正确的方式指导我吗?
谢谢!
备注:我不希望UserContext成为ChannelFactory
方法的参数,因为这意味着要更改所有服务和所有调用的参数列表...... < / p>
答案 0 :(得分:1)
构造函数的概念不存在于导线上(无论您使用何种传输方式)。因此,您永远无法使客户端调用特定的构造函数。这根本不是WCF设计的一部分(也不是SOAP的一部分)。
不要使用客户端提供的构造函数参数。或者,使服务类具有无参数ctor,并使所有服务方法接受以前的构造函数参数作为普通参数。
您还可以将公共参数作为SOAP标头传输。这可以节省您更改所有服务方法的签名。