【问题标题】:Disposable of injected class in IoC containerIoC 容器中注入类的一次性
【发布时间】:2019-05-02 15:16:25
【问题描述】:

我有Parent 类和Child 类, 父母对孩子做了一些事情,然后将其丢弃。

class Parent
{
    private IChild _child;

    Parent(IChild child) { this._child=child }

    DoAndDisposeChild()
    {
        //code
        //this._child.dispose();
    }
}

使用autofac,我正在解析Parent 并调用DoAndDisposeChild 方法:

container.Resolve<Parent>().DoAndDisposeChild().

我通过使用autofacOwend 功能成功地实现了这一点:

private Owned<IChild> _child;

并将DoAndDisposeChild修改为:

DoAndDisposeChild()
{
    //code
    this._child.Dispose();
}

问题是我将我的代码耦合到autofac,我正在寻找不使用使用autofac 来实现处置问题的方法?

【问题讨论】:

  • 一般来说,您应该处理注入的东西。您是否有非常充分的理由不将其留在容器中?
  • IoC 容器应该管理对象的生命周期。我想知道的是容器应该如何知道它必须 Dispose() 对象。
  • 一般来说,唯一应该处理对象的是创建它的东西。一次性对象注入到的类不知道是否有其他任何东西对它有引用,并且不期望它被释放。这是一个整体的最佳实践,而不仅仅是依赖注入。
  • @RobertHarvey 它取决于容器的实现。一些实现会检测对象何时是一次性的,并在它超出范围时将其丢弃。
  • Here you go。问题解决了,汤姆少校。

标签: c# ioc-container


【解决方案1】:

要将业务逻辑与 Autofac 分离,需要将 Child-class 注册为在 Composition Root-级别具有 external ownership。在这种情况下,Autofac 不会担心 任何 Child 实例的处理:

builder
    .RegisterType<Child>()
    .As<IChild>
    .ExternallyOwned();

传递给构造函数IChild

class Parent
{
    private IChild _child;

    public Parent(IChild child) { this._child=child }
    // ..
}

作为一种替代方式,创建 Child-instances 可以通过 Factory 或 something else 等单独的服务收费:

class Parent
{
    private IChild _child;

    public Parent(IChildFactory childFactory) { this._child = childFactory.CreateChild(); }    
}

【讨论】:

  • smth 不是一个词。
  • 嘿@vladimir,ExternallyOwned 是一个autofac 功能,我仍然会加入它,关于其他选项,仍然尝试解决
  • @ShaharShokrani,关于第一个选项 - 要点是仅 Composition Root(注册所有依赖项的地方)依赖于某些 IoC 容器(换句话说,Composition Root 引用了特定于 IoC 的模块如果你使用 IoC-container 是不可避免的),但是 Parent-module 和其他模块不依赖于 IoC-container。
  • 嘿,我不明白为什么我们甚至需要Owned 功能?我可以让IChild 实现IDisposable 并在没有OwnedDispose 的情况下调用this._child.Dispose()
  • 嘿,如果你的意思是 Owned - 它没有以建议的方式使用。 'clean' IChild 被注入到构造函数中:public Parent(IChild child) 并且 IoC-container 不会关心它的处理,现在它是你的责任。 IoC 给了我们 - 实例注入、生命周期管理等,但没有处理它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2016-11-13
相关资源
最近更新 更多