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

标签 c# wcf dependency-injection

我在实现和使用 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“强制”我在 MyService 的实现中使用无参数构造函数以测试它 我通过初始化 UserContext 对象添加了它。当然,我没有必要的信息来在编译时创建对象,所以这对我没有帮助。

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

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

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

最佳答案

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

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

您还可以将公共(public)参数作为 SOAP header 传输。这样可以避免更改所有服务方法的签名。

关于c# - 如何使用我的 InstanceProvider 使用自己的构造函数调用 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31558321/

相关文章:

c# - 嵌套事务范围,必需 -> 抑制 -> 必需

c# - 嵌套的文本 block 和超链接,如何在 C# 中复制此 XAML?

c# - WCF中MinFreeMemoryPercentageToActivateService的意义是什么?

c# - 从项目内的注释或 XML 文档生成 WCF 实现/使用文档

.net - 通过网络在 app.config 中加载具有 WCF 行为扩展的应用时出现 SecurityException

c# - Ninject 中的 .NET Core DI 作用域生命周期

java - EJB部署错误

java - C# 和 Java Web 服务集成

c# - 无法加载文件或程序集 FSharp.Core,版本=4.0.0.0 Azure Web 角色

c# - 使用 CaSTLe Windsor 解决混合开闭泛型问题