IoC容器中的注入类的一次性

时间:2019-05-02 15:16:26

标签: c# ioc-container

我有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().

通过使用Owend的{​​{1}}功能,我已经成功实现了这一目标:

autofac

并将private Owned<IChild> _child; 修改为:

DoAndDisposeChild

问题是我将代码耦合到DoAndDisposeChild() { //code this._child.Dispose(); } ,我正在寻找使用autofac来实现不用的处置问题的方法?

1 个答案:

答案 0 :(得分:1)

要将业务逻辑与Autofac脱钩,需要将 Child 类注册为在 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 }
    // ..
}

作为另一种方法,可以将子实例的创建收取到诸如Factory或something else之类的单独服务中:

class Parent
{
    private IChild _child;

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