Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用我的InstanceProvider使用自己的构造函数调用WCF服务_C#_Wcf_Dependency Injection - Fatal编程技术网

C# 如何使用我的InstanceProvider使用自己的构造函数调用WCF服务

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

在实现和使用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的实现。代码如下(过于简化的控制台应用程序):

类程序{
静态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();
    }
}