如何使用我的 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 解决方案创建我自己的 ServiceHostFactoryServiceHostIInstanceProvider 其中 IDependency 是一个接口 IUserContext由我的 UserContext class 实现。 这按预期工作,我在我的 svc 文件中注册了自定义工厂,我不再需要无参数构造函数。但是,由于我不知道如何将我的 UserContext 传递给 InstanceProvider,我只能得到一个默认的 UserContext 对象。

现在我的新手进来了,不知道怎么调用MyServiceby传入位于 Web 服务器中的 UserContext。我还需要自己的 ChannelFactory 吗? 有人可以通过更新网络服务器虚拟代码以正确的方式指导我吗? 谢谢!

备注:我不希望 UserContext 成为 DoWork() 方法的参数,因为那将意味着更改我所有服务和所有调用的参数列表...

线路上不存在构造函数的概念(无论您使用何种传输方式)。因此,您将永远无法让客户端调用特定的构造函数。这根本不是 WCF 设计的一部分(也不是 SOAP 的一部分)。

不要使用客户端提供的构造函数参数。或者,使服务 class 具有无参数构造函数,并使所有服务方法接受前构造函数参数作为普通参数。

您还可以将常用参数作为 SOAP headers 传输。这样可以节省您更改所有服务方法的签名。