Служба WCF с несколькими реализациями зависимости - PullRequest
2 голосов
/ 01 ноября 2010

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

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

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

Поэтому мне нужно решить

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

(2) как подходит Unity?

1 Ответ

2 голосов
/ 01 ноября 2010

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

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. Затем это начинает превращаться в общее решение для различных зависимостей в зависимости от контекста времени выполнения .

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

...