Должен ли я утилизировать экземпляры, которые не являются собственностью? - PullRequest
0 голосов
/ 14 ноября 2018

Я использую Autofac в проекте и пытаюсь сделать это правильно.Итак, я читал документацию и нашел Owned<T>.Кажется, что это правильный тип отношений, который нужно использовать, когда я хочу что-то распоряжаться собой - например, DbContext, который одноразовый.

Так что я изменил все свои введенные фабрики Func<DbContext> на Func<Owned<DbContext>>.

Единственное, что он чувствует себя немного грязным, как Lazy<T> подобное поведение, и помещает Owned в использование и в зависимости от типа не фреймворка ...

Это неправильно, не использоватьOwned вообще?

Есть ли проблема в удалении экземпляров, которые не принадлежат моему классу, как этот?

public class MyClass
{
    private readonly Func<DbContext> _dbcFactory;

    private MyClass(Func<DbContext> dbcFactory)
    {
        _dbcFactory = dbcFactory; // nullcheck etc;
    }
    private void TheMethodWhoUpdate(String newName) 
    {
        using(var dbc  = _dbcFactory())
        {
            var ent = dbc.Table.Single(x => x.id == 3);

            end.Name = newName;
            dbc.SaveChanges();
        }
    }
}

Что я смог вообразить (потому что я не могу найти подсказки в документах) это может привести к некоторой проблеме с производительностью, потому что, возможно, autofac отследит созданный экземпляр DbContext и попытается снова его утилизировать, потеряв некоторое время (возможно, очень маленькое) ... Но, возможно, я ошибаюсь, и мне следуетпридерживайтесь направляющей .

Ответы [ 2 ]

0 голосов
/ 23 марта 2019

Когда иметь только один экземпляр dbcontext (или просто любой другой класс) просто невозможно (есть много причин, по которым я не буду здесь это обсуждать), совершенно нормально создавать новые.

И использовать фабрику вместо одного экземпляра - это способ получить ее, придерживаясь шаблона внедрения зависимостей.

О Func<Owned<T>> против Func<T> Я только что нашел трудный способ, которым позвольте прицелу выполнить свою работу это просто плохая идея.

Я использовал подход Func<Owned<T>>, но даже если я избавился от всех принадлежащих областей, я получаю ОГРОМНУЮ утечку памяти.

Способ, который действительно сработал для меня, состоит в том, чтобы внедрить фабрику, которая создает dbContext (или все, что вам нужно в течение ограниченного периода времени, или нужно контролировать жизненный цикл).

Эта фабрика должна быть зарегистрирована как один экземпляр.

0 голосов
/ 14 ноября 2018

Почему бы просто не использовать Func<DbContext> dbcFactory, как показано в примере кода?

Вы не должны этого делать по двум причинам.

  1. Работа контейнера заключается в том, чтобы утилизироватьоб этом - так что пусть он выполняет свою работу.
  2. Во-вторых, если вы зарегистрируете это DbContext как InstancePerLifetimeScope, то несколько объектов (участвующих в одной и той же области действия времени жизни) получат одинаковое экземпляр DbContext - который проблематичен, если один из них выбрасывает его из-под другого.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...