Здравствуйте, 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 равно времени жизни хоста, а не экземпляра сервиса.