处置时容器应该如何表现?

时间:2011-10-16 06:51:35

标签: c#-4.0 dependency-injection inversion-of-control ioc-container autofac

是否应抛出异常,将解析传递给其父级或其他内容?

我最喜欢的容器Autofac引发了异常 - 这是我唯一不喜欢它的东西。 我认为它应该将解决方案传递给其父级,这应该通过此代码来解决我的问题


    class LazyClass
    {
        public void DoSomething() { }
    }

    class SomeClass
    {
        public event EventHandler WatchOut = (s, ea) => { };
        public void Start()
        {
            WatchOut(this, EventArgs.Empty);
        }
    }

    class LazyInterceptor
    {
        Lazy<LazyClass> lazy;
        public LazyInterceptor(Lazy<LazyClass> lazy)
        {
            this.lazy = lazy;
        }
        public void Register(SomeClass some)
        {
            some.WatchOut += (s, ea) => lazy.Value.DoSomething();
        }
    }

    [TestMethod]
    public void LazyAndEvents()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<LazyClass>().SingleInstance();
        var container = builder.Build();

        var someClass = new SomeClass();

        using (var inner = container.BeginLifetimeScope(cb => 
            cb.RegisterType().SingleInstance()))
        {
            var interceptor = inner.Resolve();
            interceptor.Register(someClass);
        }

        someClass.Start();
    }

我知道有三种解决方法,但它们似乎都是错误的

  • 没有处理容器 - 这就是我目前所做的,但这只是为了让Autofac高兴
  • 明确注册懒惰 - 似乎错了,我甚至不知道将解决什么
  • 取得所有权以进行处置 - 它看起来并不坏,但我不会以这种方式使用对象,所以它看起来像是一种解决方法。此外,在Autofac中它引入了依赖,这是不好的

1 个答案:

答案 0 :(得分:4)

生命周期范围的重点是控制所包含实例的生存期。在Disposable模式的基础上,处理容器是一种清晰且完善的方式来释放由该容器管理的资源。因此,当处置生命周期范围时,您不应再依赖于从该生命周期范围中解析的实例。

所以我会说你在这里错误地使用Autofac。也许如果您解释了为什么要使用这样的范围,我们可以找出正确的用法。