工作单元,ILifetimeScope和Autofac容器

时间:2019-01-30 16:27:57

标签: c# autofac

我有一个实施工作单元的项目。通常,我使用 using 语句执行工作单元。阅读Autofac文档,它说“从容器中创建子生存期范围并从中解析”。。在我要使用工作单元的类中,是否使用构造函数注入来注入 ILifetimeScope 以便创建子生命周期范围?

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

        // do something

        uow.Complete();
    }

Autofac文档

Autofac Execution Section

  

在应用程序执行期间,您将需要使用已注册的组件。您可以通过从生命周期范围内解决它们来做到这一点。

     

容器本身是生命周期的范围,从技术上讲,您可以直接从容器中解决问题。但是,不建议直接从容器中解析。

     

解析组件时,根据定义的实例范围,将创建对象的新实例。 (解析一个组件大致相当于调用“ 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文档,并且至少在执行部分中,他们建议不要从根本上解决问题,但请告诉我您是否有不同的看法。我正在学习,因此我想听听您的任何见解。谢谢!

0 个答案:

没有答案