Re[3]: Как передать в WCF веб-сервис ссылку на другой компон
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 19.04.15 12:20
Оценка:
Здравствуйте, IvanXXX, Вы писали:

IXX>Относительно IInstanceProvider: проблема в том, что экземпляр провайдера создается средой WCF путем вызова конструктора без параметров. Если у меня была проблема — передать ссылки на какие-то объекты создаваемому веб-сервису, то теперь проблема — передать их провайдеру, который создает сервис.

Честно, не понял в чем проблема...
Если вы используете Self-Hosting схему, т.е. сами создаете ServiceHost, то что вам мешает сделать, например так:

Создать InstanceProvider с конструктором, в который вы будете передавать все нужные данные (можете сразу совместить его с IServiceBehavior) — реализация есть в статье, на которую я давал ссылку выше.
class InstanceProvider : IInstanceProvider, IServiceBehavior
{
    private readonly object _instanceData;

    public InstanceProvider(object instanceData)
    {
        _instanceData = instanceData;
    }

    // Реализация обоих интерфейсов опущена
}


А далее сделать как-то так:
object instanceData = new object();
var host = new ServiceHost(typeof (Service));
host.Description.Behaviors.Add(new InstanceProvider(instanceData));



Если у вас IIS хостинг, то просто код инициализации хоста переедет в фабрику хостов.

IXX>Теперь из любого метода веб-сервиса можно обратиться к данным, переданным приложением:

IXX>
IXX>var appData = ((MyServiceHost)OperationContext.Current.Host).Data;
IXX>

Ну и где вы избавились от неявных зависимостей? Вы же теперь классы привязали даже не к статическому полю, а к полю внутри инфраструктуры. Т.е. для тестирования ваших сервисов, вам теперь придется поднимать всю WCF инфраструктуру (я сильно сомневаюсь, что вы сможете легко создать или замокировать OperationContext и иже с ним.

IXX>Смущает только очевидная простота схемы по сравнению с расширением WCF через custom IInstanceProvider.

Ну так он и сильно хуже.
Помимо того, что вы не избавились от зависимости, а только её усилили (т.к. теперь вы зависите еще и от инфраструктуры WCF, через которою вы получаете все данные), вы также имеете только 1 экземпляр данных, которые можно передать сервису. Т.е. если тут будет какой-нибудь репозиторий, который нужно создавать и уничтожать на каждый запрос — вы этого сделать не сможете, у вас время жизни поля Data равно времени жизни хоста, а не экземпляра сервиса.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.