Единица работы, ILifetimeScope, и контейнер Autofac - PullRequest
0 голосов
/ 30 января 2019

У меня есть проект, который реализует Единицу Работы.Обычно я выполняю единицу работы, используя , используя оператор .Читая документацию Autofac, он говорит "создать дочернюю область действия из контейнера и разрешить из этого" .В классе, в котором я хочу использовать свою единицу работы, могу ли я использовать инжектор конструктора для внедрения ILifetimeScope , чтобы я мог создать область действия моего дочернего элемента?

    using (var scope = container.BeginLifetimeScope())
    {
        var uow = scope.Resolve<IUnitOfWork>();

        // do something

        uow.Complete();
    }

Документация Autofac

Секция выполнения Autofac

Во время выполнения приложения вам необходимо будет использовать компоненты, которые вы зарегистрировали.Вы делаете это, разрешая их из области действия на весь срок действия.

Сам контейнер является областью действия на весь срок службы, и технически вы можете просто разрешать вещи прямо из контейнера.Однако не рекомендуется выполнять разрешение непосредственно из контейнера.

При разрешении компонента в зависимости от определенной области экземпляра создается новый экземпляр объекта.(Разрешение компонента примерно эквивалентно вызову «new» для создания экземпляра класса. Это действительно, очень упрощает его, но с точки зрения аналогии это нормально.) Некоторые компоненты, возможно, должны быть удалены (как они реализуют IDisposable) - Autofac может обработатьутилизировать эти компоненты для вас при утилизации жизненного объема.

Однако контейнер живет в течение всего срока службы вашего приложения.Если вы решите много вещей непосредственно из контейнера, у вас может сложиться много вещей, ожидающих утилизации.Это нехорошо (и это может привести к «утечке памяти»).

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

Пример из документации Autofac

    namespace DemoApp
    {
      public class Program
      {
        private static IContainer Container { get; set; }

        static void Main(string[] args)
        {
          // ...the stuff you saw earlier...
        }

        public static void WriteDate()
        {
          // Create the scope, resolve your IDateWriter,
          // use it, then dispose of the scope.
          using (var scope = Container.BeginLifetimeScope())
          {
            var writer = scope.Resolve<IDateWriter>();
            writer.WriteDate();
          }
        }
      }
    }

Обновление на основе комментариев ниже

Это веб-приложение (MVC), которое я создаю для целей обучения.Я буду управлять своей единицей работы из уровня обслуживания.Пожалуйста, дайте мне знать, если это неправильный подход, но я видел, как некоторые другие делают это.Я считаю, что это выполняется по запросу, но как я смогу проверить?Отладка?Я не знаю, почему это нужно изолировать.Я только что читал документацию Autofac, и они рекомендуют, по крайней мере, в разделе выполнения, не разрешать из корня, но, пожалуйста, скажите мне, если вы чувствуете по-другому.Я учусь, поэтому любое понимание, которое у вас есть, я бы хотел услышать.Спасибо!

...