我终于在C#中围绕IoC和DI缠绕我的头,并且正在努力解决一些问题.我正在使用Unity容器,但我认为这个问题适用范围更广.
使用IoC容器来分配实现IDisposable的实例让我感到害怕!你怎么知道你应该Dispose()?该实例可能是专门为您创建的(因此您应该Dispose()它),或者它可能是其生命周期在其他地方管理的实例(因此您最好不要).代码中没有任何内容告诉您,实际上这可能会根据配置发生变化!这对我来说似乎是致命的.
任何IoC专家都可以描述处理这种模糊性的好方法吗?
所以我正在研究我的DI/IoC容器OpenNETCF.IoC,我有一个(合理的)功能请求,为容器集合中的IDisposable项添加某种形式的生命周期管理.
我当前的想法是,因为我不能查询一个对象以查看它是否已被处理,并且我无法获得一个事件,因为它被处理掉了,我必须为开发人员想要的对象创建某种形式的包装器要管理的框架.
现在可以使用AddNew添加对象(为简单起见,我们假设只有一个重载,并且没有Add):
public TTypeToBuild AddNew<TTypeToBuild>() { ... }
Run Code Online (Sandbox Code Playgroud)
我正在考虑的是添加一种新方法(很好的一组,但你得到的图片):
public DisposableWrappedObject<IDisposable> AddNewDisposable<TTypeToBuild>()
where TTypeToBuild : class, IDisposable
{
...
}
Run Code Online (Sandbox Code Playgroud)
DisposableWrappedObject的位置如下所示:
public class DisposableWrappedObject<T>
where T : class, IDisposable
{
public bool Disposed { get; private set; }
public T Instance { get; private set; }
internal event EventHandler<GenericEventArgs<IDisposable>> Disposing;
internal DisposableWrappedObject(T disposableObject)
{
if (disposableObject == null) throw new ArgumentNullException();
Instance = disposableObject;
}
~DisposableWrappedObject()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
}
protected virtual …Run Code Online (Sandbox Code Playgroud) c# dependency-injection compact-framework ioc-container opennetcf.ioc