Одноразовый из введенного класса в контейнере IoC - PullRequest
2 голосов
/ 02 мая 2019

У меня есть 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 autofac с:

private Owned<IChild> _child;

И изменить DoAndDisposeChild на:

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

Проблема в том, что я связываю свой код с autofac, я ищу способы реализации проблемы утилизации без с использованием autofac?

1 Ответ

1 голос
/ 05 мая 2019

Чтобы отделить бизнес-логику от Autofac, необходимо зарегистрировать класс Child как обладающий внешним владением на Корень композиции . В этом случае Autofac не будет беспокоиться об утилизации любого экземпляра Child :

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

Передача в конструктор IChild :

class Parent
{
    private IChild _child;

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

В качестве альтернативы, создание дочерних экземпляров можно поручить отдельным службам, таким как Factory или что-то еще :

class Parent
{
    private IChild _child;

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