我终于在C#中围绕IoC和DI缠绕我的头,并且正在努力解决一些问题.我正在使用Unity容器,但我认为这个问题适用范围更广.
使用IoC容器来分配实现IDisposable的实例让我感到害怕!你怎么知道你应该Dispose()?该实例可能是专门为您创建的(因此您应该Dispose()它),或者它可能是其生命周期在其他地方管理的实例(因此您最好不要).代码中没有任何内容告诉您,实际上这可能会根据配置发生变化!这对我来说似乎是致命的.
任何IoC专家都可以描述处理这种模糊性的好方法吗?
Unity 2.0:
默认情况下,RegisterInstance使用ContainerControlledLifetimeManager.当处置Unity容器时,它会调用实例上的Dispose(如果是IDisposable).
在我的情况下,这不是我想要的.该实例由另一个类拥有并处置; Unity应该只注入引用.所以我用过:
container.RegisterInstance(instance, new ExternallyControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
Unity文档(在了解终身经理下)指出:
使用RegisterInstance方法注册现有对象会产生与刚刚使用RegisterType注册生命周期容器相同的行为.因此,建议您在使用非默认生存期管理器时不使用RegisterInstance方法注册现有对象,但调用RegisterInstance的线程除外.
这是什么意思?
同一部分还指出:
如果使用RegisterInstance方法注册了对象的现有实例,则容器将为Resolve或ResolveAll的所有调用返回相同的实例,或者当依赖性机制将实例注入其他类时,前提是满足下列条件之一:
- 您已指定容器控制的生命周期管理器
- 您已使用默认生命周期管理器
- 您正在使用不同的生命周期管理器在您注册实例的相同上下文中进行解析.
在使用RegisterInstance和ExternallyControlledLifetimeManager之后,我尝试在另一个线程中解析,并且它工作了 - 我得到了单例实例.
我的代码与"创建实例注册"部分中的示例相匹配.不过,我想确保理解背景警告.
为了清楚起见,我总是希望Unity容器注入我注册的实例而不管线程等,我不希望Unity处理它.我这样做了吗?
c# dependency-injection idisposable unity-container unity2.0
所以我正在研究我的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
有没有办法让Unity将属性注入的对象作为拆解的一部分进行处理?
背景是我正在使用ASP.NET MVC 2,Unity和WCF的应用程序.我们编写了自己的MVC控制器工厂,它使用unity实例化控制器,并使用控制器公共属性的[Dependency]属性注入WCF代理.在页面生命周期结束时,调用控制器工厂的ReleaseController方法,并调用IUnityContainer.Teardown(theMvcController).此时控制器按预期处理,但我还需要处理注入的wcf代理.(实际上我需要对它们调用Close和/或Abort而不是Dispose但这是后来的问题.)
我当然可以覆盖控制器的Dispose方法并清理那里的代理,但我不希望控制器必须知道注入接口的生命周期,甚至是它们引用WCF代理.
如果我需要自己编写代码 - 什么是最好的扩展点?我很欣赏任何指针.