【问题标题】:How to prevent DryIoc to dispose singletons on child container dispose如何防止 DryIoc 在子容器 dispose 上处理单例
【发布时间】:2020-10-17 19:39:59
【问题描述】:

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

【问题讨论】:

    标签: c# dryioc


    【解决方案1】:

    如果处置子容器造成麻烦,请不要处置它:) 谢谢大地。

    using (var child = parent.With(parent.Rules, parent.ScopeContext, RegistrySharing.CloneAndDropCache, parent.SingletonScope.Clone())
    .OpenScope()) // Here!
    

    不需要dispose子容器,因为通过打开新的范围,所有的disposables都将在显式范围内被跟踪。

    【讨论】:

      【解决方案2】:

      您可以改为打开一个作用域上下文,它会按预期工作。您需要一个作用域上下文无法解决的子容器的原因并不多。

      using (var child = parent.OpenScope())
      {
          var service2 = child.Resolve<IService>();
          Assert.AreEqual(service, service2);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 2018-03-14
        • 2016-11-27
        • 2019-10-17
        相关资源
        最近更新 更多