简单注入器-实现IDisposable的瞬态对象,具体取决于其他瞬态对象

时间:2019-03-11 09:22:54

标签: c# dependency-injection simple-injector

我正在编写一个服务,该服务告诉实现接口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();
}

使用简单注入器,将设备查找器传递到构造函数中的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)
    {
        //...
    }
}

但是,简单注入器给我一个警告,瞬态DeviceService无法实现IDisposable

当我将生活方式更改为作用域时,我会收到一条警告,指出生活方式不匹配,因为DeviceService(异步作用域)取决于IDeviceFinder[](瞬态)。

如何解决此错误?我真的不想摆脱IDisposable界面。

0 个答案:

没有答案