1 Вопрос: Одноразовый из введенного класса в контейнере IoC

вопрос создан в Thu, May 2, 2019 12:00 AM

У меня есть класс 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?

    
2
  1. В общем случае вы не должны утилизировать что-то, что было введено. У вас есть очень веская причина не оставлять его в контейнере?
    2019-05-02 15: 30: 00Z
  2. Предполагается, что контейнер IoC управляет временем жизни объекта. Что мне интересно, так это то, как контейнер должен знать, что он должен Dispose() объекта.
    2019-05-02 17: 25: 42Z
  3. Как правило, единственное, что должно распоряжаться объектом, - это то, что его создало. Класс, в который вводится одноразовый объект, не знает, имеет ли что-либо еще ссылку на него, и не ожидает, что он будет удален. Это общая лучшая практика, а не просто введение с зависимостями.
    2019-05-02 17: 26: 42Z
  4. @ RobertHarvey, это зависит от реализации контейнера. Некоторые реализации обнаруживают, когда объект является одноразовым, и удаляют его, когда он выходит из области видимости.
    2019-05-02 17: 28: 03Z
  5. Здесь вы находитесь . Проблум решен, майор Том.
    2019-05-02 17: 29: 09Z
1 ответ                              1                         

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

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

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

class Parent
{
    private IChild _child;

    public Parent(IChildFactory childFactory) { this._child = childFactory.CreateChild(); }    
}
    
0
2019-05-05 15: 09: 40Z
  1. что-то - это не слово.
    2019-05-05 15: 09: 48Z
  2. Привет, @vladimir, ExternallyOwned - это функция автозапуска, я все еще буду в ней участвовать, о другом варианте, все же попробую разобраться в этом
    2019-05-12 04: 06: 26Z
  3. @ ShaharShokrani, о первом варианте - главное в том, что просто Composition Root (место, где зарегистрированы все зависимости) зависит от некоторого IoC-контейнера (другими словами, Composition Root имеет ссылки на IoC-специфичные модули, что неизбежно, если вы используете IoC-контейнер), но Parent-модуль и другие модули не имеют зависимостей от IoC-контейнера.
    2019-05-12 04: 53: 15Z
источник размещен Вот