如何防止 DryIoc 在子容器上处理单例
How to prevent DryIoc to dispose singletons on child container dispose
我想使用 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!
不需要释放子容器,因为通过打开新的范围,所有的一次性容器都将在显式范围内被跟踪。
您可以改为打开范围上下文,它将按预期工作。您需要一个范围上下文无法解决的子容器的原因并不多。
using (var child = parent.OpenScope())
{
var service2 = child.Resolve<IService>();
Assert.AreEqual(service, service2);
}
我想使用 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!
不需要释放子容器,因为通过打开新的范围,所有的一次性容器都将在显式范围内被跟踪。
您可以改为打开范围上下文,它将按预期工作。您需要一个范围上下文无法解决的子容器的原因并不多。
using (var child = parent.OpenScope())
{
var service2 = child.Resolve<IService>();
Assert.AreEqual(service, service2);
}