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

时间:2015-07-22 08:50:41

标签: c# wcf dependency-injection

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

现在我的新手进来。我不知道如何调用 MyService 传入 {{1它存在于Web服务器中。我还需要自己UserContext吗? 有人可以通过更新Web服务器虚拟代码以正确的方式指导我吗? 谢谢!

备注:我不希望UserContext成为ChannelFactory方法的参数,因为这意味着要更改所有服务和所有调用的参数列表...... < / p>

1 个答案:

答案 0 :(得分:1)

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

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

您还可以将公共参数作为SOAP标头传输。这可以节省您更改所有服务方法的签名。