如何使用我的 InstanceProvider 使用自己的构造函数调用 WCF 服务
How to invoke WCF service with own constructor using my InstanceProvider
我在实施和使用 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 "forced" 我在 MyService
的实现中使用无参数构造函数以测试它 我通过初始化 UserContext
对象添加了它。当然,我没有必要的信息来在编译时创建对象,所以这对我没有帮助。
我继续使用 this 解决方案创建我自己的 ServiceHostFactory
、ServiceHost
和 IInstanceProvider
其中 IDependency
是一个接口 IUserContext
由我的 UserContext
class 实现。
这按预期工作,我在我的 svc 文件中注册了自定义工厂,我不再需要无参数构造函数。但是,由于我不知道如何将我的 UserContext
传递给 InstanceProvider
,我只能得到一个默认的 UserContext
对象。
现在我的新手进来了,不知道怎么调用MyService
by传入位于 Web 服务器中的 UserContext
。我还需要自己的 ChannelFactory
吗?
有人可以通过更新网络服务器虚拟代码以正确的方式指导我吗?
谢谢!
备注:我不希望 UserContext 成为 DoWork()
方法的参数,因为那将意味着更改我所有服务和所有调用的参数列表...
线路上不存在构造函数的概念(无论您使用何种传输方式)。因此,您将永远无法让客户端调用特定的构造函数。这根本不是 WCF 设计的一部分(也不是 SOAP 的一部分)。
不要使用客户端提供的构造函数参数。或者,使服务 class 具有无参数构造函数,并使所有服务方法接受前构造函数参数作为普通参数。
您还可以将常用参数作为 SOAP headers 传输。这样可以节省您更改所有服务方法的签名。
我在实施和使用 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 "forced" 我在 MyService
的实现中使用无参数构造函数以测试它 我通过初始化 UserContext
对象添加了它。当然,我没有必要的信息来在编译时创建对象,所以这对我没有帮助。
我继续使用 this 解决方案创建我自己的 ServiceHostFactory
、ServiceHost
和 IInstanceProvider
其中 IDependency
是一个接口 IUserContext
由我的 UserContext
class 实现。
这按预期工作,我在我的 svc 文件中注册了自定义工厂,我不再需要无参数构造函数。但是,由于我不知道如何将我的 UserContext
传递给 InstanceProvider
,我只能得到一个默认的 UserContext
对象。
现在我的新手进来了,不知道怎么调用MyService
by传入位于 Web 服务器中的 UserContext
。我还需要自己的 ChannelFactory
吗?
有人可以通过更新网络服务器虚拟代码以正确的方式指导我吗?
谢谢!
备注:我不希望 UserContext 成为 DoWork()
方法的参数,因为那将意味着更改我所有服务和所有调用的参数列表...
线路上不存在构造函数的概念(无论您使用何种传输方式)。因此,您将永远无法让客户端调用特定的构造函数。这根本不是 WCF 设计的一部分(也不是 SOAP 的一部分)。
不要使用客户端提供的构造函数参数。或者,使服务 class 具有无参数构造函数,并使所有服务方法接受前构造函数参数作为普通参数。
您还可以将常用参数作为 SOAP headers 传输。这样可以节省您更改所有服务方法的签名。