Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
具有多个依赖性实现的WCF服务_Wcf_Dependency Injection_Unity Container - Fatal编程技术网

具有多个依赖性实现的WCF服务

具有多个依赖性实现的WCF服务,wcf,dependency-injection,unity-container,Wcf,Dependency Injection,Unity Container,我有一个WCF服务,将从不同的客户端调用 在内部,WCF服务使用了一个ISomething。这个接口有多个实现,我需要一些客户端使用一个实现,其他客户端使用不同的实现 此外,我正在使用Unity和IoC容器。我通常会设置一个自定义工厂,以允许wcf服务本身与其依赖关系图一起解析,但如果我有多个依赖关系实现,我认为我不能采用这种方法,必须求助于解析服务中的问题(有效地使用Unity作为服务定位器)这并不理想 所以我需要锻炼 (1) 如何指定客户端需要的ISomething实现(例如,使用头、在每个

我有一个WCF服务,将从不同的客户端调用

在内部,WCF服务使用了一个ISomething。这个接口有多个实现,我需要一些客户端使用一个实现,其他客户端使用不同的实现

此外,我正在使用Unity和IoC容器。我通常会设置一个自定义工厂,以允许wcf服务本身与其依赖关系图一起解析,但如果我有多个依赖关系实现,我认为我不能采用这种方法,必须求助于解析服务中的问题(有效地使用Unity作为服务定位器)这并不理想

所以我需要锻炼

(1) 如何指定客户端需要的ISomething实现(例如,使用头、在每个方法中传递实现字符串、承载多个端点等)


(2) Unity的适用性如何?

一个选项是编写一个装饰器,为您执行选择:

public class RoutingSomething : ISomething
{
    private readonly ISomeContext ctx;
    private readonly ISomething s1;
    private readonly ISomething s2;
    private readonly ISomething s3;

    public RoutingSomething(ISomeContext ctx)
    {
        this.ctx = ctx;

        // An even better design would be to inject these too
        this.s1 = new BarSomething();
        this.s2 = new BazSomething();
        this.s3 = new QuxSomething();
    }

    // Assuming ISomething has a Foo method:
    public void Foo()
    {
        if(this.ctx.Bar())
        {
            this.s1.Foo();
            return;
        }
        if(this.ctx.Baz())
        {
            this.s2.Foo();
            return;
        }
        if(this.ctx.Qux())
        {
            this.s3.Foo();
            return;
        }
    }
}
您可以对其进行概括,使ISomeContext只是ISomething的一个抽象工厂。然后,这就开始变成了一个问题


除了其他组件之外,您现在还可以在Unity中注册RoutingSomething。当容器解析服务时,它将向其中注入RoutingSomething的实例。

这很好,但我仍然需要服务知道客户端想要使用哪个实现。我如何传递这些信息,以便在解析服务时能够尽早访问这些信息?该服务是否受到任何身份验证的保护?如果是,您可能能够使用经过身份验证的主体作为密钥来选择正确的服务。否则,自定义标题听起来是一个合理的选择。