Простой инжектор - временный объект, реализующий IDisposable, в зависимости от других временных объектов - PullRequest
1 голос
/ 11 марта 2019

Я пишу службу, которая сообщает нескольким классам, реализующим интерфейс 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.

...