问题描述
我想使用DryIoc的子容器,但是不知何故,它正在从父容器中处理单例。如何创建可解决单例实例但不处理它们的子容器?
[Test]
public void Test1()
{
IService service;
using (var parent = new Container())
{
parent.Register<IService,Service>(Reuse.Singleton);
service = parent.Resolve<IService>();
using (var child = parent.With(parent.Rules,parent.ScopeContext,RegistrySharing.CloneAndDropCache,parent.SingletonScope.Clone()))
{
var service2 = child.Resolve<IService>();
Assert.AreEqual(service,service2);
}
Assert.IsFalse(service.Isdisposed); //child container disposed parent singleton!!!
}
Assert.IsTrue(service.Isdisposed);
}
public interface IService
{
bool Isdisposed { get; }
}
public class Service : IService,Idisposable
{
public void dispose() => Isdisposed = true;
public bool Isdisposed { get; private set; }
}
解决方法
如果处理子容器引起麻烦,请不要处理它:) 谢谢达西。
using (var child = parent.With(parent.Rules,parent.ScopeContext,RegistrySharing.CloneAndDropCache,parent.SingletonScope.Clone())
.OpenScope()) // Here!
无需处置子容器,因为通过打开新作用域,所有一次性物品都将在显式作用域内进行跟踪。