Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止在子容器dispose上处理单例_C#_Dryioc - Fatal编程技术网

C# 如何防止在子容器dispose上处理单例

C# 如何防止在子容器dispose上处理单例,c#,dryioc,C#,Dryioc,我想使用DryIoc中的子容器,但不知怎的,它正在处理父容器中的单例。如何创建解析单例实例但不处理它们的子容器 [Test] public void Test1() { IService service; using (var parent = new Container()) { parent.Register<IService, Service>(Reuse.Singleton);

我想使用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; }
    }
[测试]
公共void Test1()
{
电视服务;
使用(var parent=new Container())
{
注册(重用单例);
service=parent.Resolve();
使用(var child=parent.With(parent.Rules、parent.ScopeContext、RegistrySharing.CloneAndDropCache、parent.SingletonScope.Clone())
{
var service2=child.Resolve();
断言.AreEqual(服务,服务2);
}
Assert.IsFalse(service.IsDisposed);//子容器处理父单例!!!
}
Assert.IsTrue(service.IsDisposed);
}
公共接口设备
{
bool IsDisposed{get;}
}
公共类服务:IService,IDisposable
{
public void Dispose()=>IsDisposed=true;
公共布尔值显示为{get;private set;}
}

如果处理子容器会导致问题,请不要处理它:) 谢谢爸爸

using (var child = parent.With(parent.Rules, parent.ScopeContext, RegistrySharing.CloneAndDropCache, parent.SingletonScope.Clone())
.OpenScope()) // Here!
不需要弃置子容器,因为通过打开新的作用域,所有弃置项都将在显式作用域内跟踪