如何防止DryIoc在子容器处置中处置单例

问题描述

我想使用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!

无需处置子容器,因为通过打开新作用域,所有一次性物品都将在显式作用域内进行跟踪。