Я пишу службу, которая сообщает нескольким классам, реализующим интерфейс IDeviceFinder
, для поиска подключенных устройств, которые служба поместит в кэш для использования другими объектами.
Скрипт контроллера выглядит следующим образом:
private Container _container;
public bool Start()
{
_container.Collection.Register<IDeviceFinder>(
new Assembly[] { Assembly.GetExecutingAssembly() });
_container.Register<IDeviceCache, DeviceCache>(Lifestyle.Singleton);
_container.Register<IDeviceService, DeviceService>();
_container.Verify();
}
Используя Simple Injector, средства поиска устройств передаются в DeviceService
в конструкторе. Когда искатели находят устройство, они сообщают об этом сервису через делегата. Затем служба переходит в кэш устройства (одноэлементный).
Служба устройства сама реализует интерфейс IDisposable
. Используя Dispose
, сервис отписывается от делегатов поиска устройств.
public class DeviceService : IDeviceService //IDeviceService inherits from IDisposable
{
private IDeviceCache _cache;
private List<IDeviceFinder> _finders = new List<IDeviceFinder>();
public DeviceService(IDeviceCache cache, IDeviceFinder[] finders)
{
this._cache = cache;
this._finders = finders.ToList();
foreach (var finder in this._finders)
{
finder.DeviceFound += AddDeviceToCache;
}
}
public void Dispose()
{
foreach (var finder in this._finders)
{
finder.DeviceFound -= AddDeviceToCache;
}
}
private void AddDeviceToCache(Device device)
{
//...
}
}
Однако Simple Injector дает мне предупреждение, что переходный процесс DeviceService
не может реализовать IDisposable
.
Когда я изменяю образ жизни, который должен быть ограничен, я получаю предупреждение о несоответствии образа жизни, потому что DeviceService
(асинхронная область) зависит от IDeviceFinder[]
(переходный процесс).
Как бы я исправить эту ошибку? Я действительно не хочу избавляться от интерфейса IDisposable
.