具有多个依赖性实现的WCF服务
我有一个WCF服务,将从不同的客户端调用 在内部,WCF服务使用了一个ISomething。这个接口有多个实现,我需要一些客户端使用一个实现,其他客户端使用不同的实现 此外,我正在使用Unity和IoC容器。我通常会设置一个自定义工厂,以允许wcf服务本身与其依赖关系图一起解析,但如果我有多个依赖关系实现,我认为我不能采用这种方法,必须求助于解析服务中的问题(有效地使用Unity作为服务定位器)这并不理想 所以我需要锻炼 (1) 如何指定客户端需要的ISomething实现(例如,使用头、在每个方法中传递实现字符串、承载多个端点等)具有多个依赖性实现的WCF服务,wcf,dependency-injection,unity-container,Wcf,Dependency Injection,Unity Container,我有一个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的实例。这很好,但我仍然需要服务知道客户端想要使用哪个实现。我如何传递这些信息,以便在解析服务时能够尽早访问这些信息?该服务是否受到任何身份验证的保护?如果是,您可能能够使用经过身份验证的主体作为密钥来选择正确的服务。否则,自定义标题听起来是一个合理的选择。