2010-11-01 3 views
2

У меня есть служба WCF, которая будет вызываться от разных клиентов.Служба WCF с несколькими реализациями зависимостей

Внутренне служба WCF использует ISomething. Существует несколько реализаций этого интерфейса, и мне нужно, чтобы некоторые клиенты использовали одну реализацию и другие клиенты для использования другой реализации.

Кроме того, я использую Unity и контейнер IoC. Я бы обычно настраивал фабрику, позволяющую разрешать работу службы wcf вместе с графиком зависимости, но если у меня есть несколько реализаций зависимости, я не думаю, что смогу пойти с этим подходом и прибегнуть к разрешению ISomething внутри службы (эффективно используя Unity как локатор сервисов), что не является идеальным.

Так что нужно работать

(1), как определить, какая реализация ISomething клиенту необходимо (например, использовать заголовок, передать строку реализации в каждом методе, провести несколько конечных точек и т.д.)

(2) как вступает Unity?

ответ

2

Одним из вариантов является написание декоратора, который выполняет выбор для вас:

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. Затем это начинает превращаться в general solution to varying dependencies based on run-time context.

Теперь вы можете зарегистрировать RoutingSomething в Unity в дополнение к вашим другим компонентам. Когда контейнер разрешит услугу, он добавит в него экземпляр RoutingSomething.

+0

Это довольно изящно, но мне все еще нужно, чтобы служба узнала, какую реализацию КЛИЕНТ хочет использовать. Как передать эту информацию, чтобы к ней можно было получить доступ достаточно рано, чтобы быть доступным, когда я разрешаю эту услугу? –

+0

Является ли служба защищенной путем какой-либо аутентификации? Если это так, вы можете использовать аутентифицированный директор в качестве ключа для выбора правильной услуги. В противном случае пользовательский заголовок звучит как разумный вариант. –

Смежные вопросы