Я инъекционного бизнес-слой в самопринятый (InstanceContextMode = за вызов) службы WCF за счет использования ServiceHost.AddDependencyInjectionBehavior()
расширение AutoFac (как описано в Autofac documentation)Autofac с самодостаточно службы WCF и удаления объекта
В моем бизнес-слое используются компоненты, которые нельзя воссоздавать каждый раз, когда приходит новый запрос (предположим, что для этого требуется постоянное соединение с базой данных).
Таким образом, при создании контейнера Я хотел бы зарегистрировать услугу BL в качестве одного экземпляра, т.е .:
builder.RegisterType<BusinessLayer>()
.SingleInstance();
Инъекция бизнес-слой в службу WCF работает нормально; моя проблема в том, что:
Dispose() не вызван ни в какие сервисы, созданные в контейнере: не только сам бизнес-уровень, но и «постоянные» службы.
Я ожидаю, что это произойдет для службы BL. Из Autofac docs снова:
Если у вас есть одноэлементные компоненты (зарегистрированные в качестве SingleInstance()) они будут жить жизнь контейнера. Поскольку время жизни контейнера обычно является временем жизни приложения, это означает, что компонент не будет размещен до конца приложения.
, но почему их нет моего «ребенка» (Autofac зарегистрированных) услуг (то есть «» IPersistentService ниже), расположенный, когда область Время жизни - при условии, что я явно не делает их «SingleInstance «? Примечание:: это еще случай, если я вручную выбрасывайте обслуживание бизнес-слоя в пределах срока службы объема после того, как закрыть ServiceHost
Э.Г. (IDisposable реализаций для краткости опускаем):
[ServiceContract]
public interface IMyService
{
void DoStuff();
}
public class MyService : IMyService
{
IBusinessLayer _bl;
public MyService(IBusinessLayer bl)
{
_bl = bl;
}
public void DoStuff()
{
_bl.BLDoStuff();
}
}
public interface IBusinessLayer
{
void BLDoStuff();
}
public class BusinessLayer : IBusinessLayer
{
IPersistentService _service;
public BusinessLayer(IPersistentService service)
{
_service = service;
}
public void BLDoStuff()
{
// Do something that requires a 'cached'/persistent component
_service.DoSomethingWithPersistentConnection();
}
}
public interface IPersistentService : IDisposable
{
void DoSomethingWithPersistentConnection();
}
С регистрацией Autofac ищут что-то вроде:
builder.RegisterType<BusinessLayer>()
.SingleInstance();
builder.RegisterType<MyPersistentService>()
.As<IPersistentService>()
.OnActivated(e => e.Instance.Start());
«Почему ни одна из моих« дочерних »(зарегистрированных через Autofac) служб (т. Е.« IPersistentService »ниже), если область действия« равна ». Эту проблему обычно называют [Captive Dependency] (http://blog.ploeh.dk/2014/06/02/captive-dependency/). – Steven
Справа. Ип, это объясняет - и спасибо за ссылку на это описание. – Ive