InstancePerLifeTimeScope和对象的生命周期

时间:2016-02-04 22:43:41

标签: autofac

我是Autofac依赖注入的新手,我得到了与我的项目相关的这些问题。我已经阅读了很多文章,但我没有清楚地了解我的一些问题。我是.Net REST API上的服务应用程序。我正在App_Start模块中进行实例注册,如下所示。

private static IContainer RegisterServices(ContainerBuilder builder)
        {
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
            builder.RegisterType<DCLMessengerContext>()
                   .As<DbContext>()
                   .ExternallyOwned()
                   .InstancePerLifetimeScope();
            builder.RegisterType<DbFactory>()
                   .As<IDbFactory>()
                   .ExternallyOwned()
                   .InstancePerLifetimeScope();
            builder.RegisterType<UnitOfWork>()
                   .As<IUnitOfWork>()
                  .InstancePerLifetimeScope();
            builder.RegisterGeneric(typeof(EntityBaseRepository<>))
                   .As(typeof(IEntityBaseRepository<>))
                   .InstancePerLifetimeScope();
            builder.RegisterType<PersonServiceClient>()
                   .As<IPerfService>()
                   .InstancePerLifetimeScope();
            builder.RegisterType<PagingServiceContractClient>()
                   .As<PagingServiceContract>()
                   .InstancePerLifetimeScope();
            builder.RegisterType<MessageService>()
                    .As<IMessageService>()
                    .InstancePerLifetimeScope();
            Container = builder.Build();
            return Container;

        }

我的服务层是&#34; MessageService&#34;我正在执行所有数据库和其他集成操作,并通过构造函数注入获取实例。这些是我对此实现的问题。

  1. 我正在使用InstancePerLifeTimeScope进行所有注册。这是正确的方法吗?在每个控制器请求(http请求)的生命周期之后,这些实例是否会自动处理?
  2. 我们是否需要在任何这些实例上手动执行任何Dispose操作? (我的代码中没有任何非托管对象)
  3. 从服务方法来看,我需要使用Task.Run()创建一个fire&amp; forget线程。为这个火灾和遗忘线程提供实例的最佳方法是什么?如果我使用InstancePerLifeTimeScope,我可以看到新线程也获得了通过服务类可用的相同实例,所以我只是在处理这些实例时感到困惑?

1 个答案:

答案 0 :(得分:2)

  

解析每个生命周期范围组件的实例时,会得到一个   每个嵌套范围的单个实例

  1. 所以如果你在控制器中使用它们。每个请求您将有一个对象,它们将被处置。但是如果你在一个单独的对象中解决它们,他们将会使用这个对象。
  2.   

    这是正确的方法吗?

    这取决于你的需要。如果你需要单身对象,那就不是。如果您只想在请求范围中使用此服务,请使用instanceperrequest,这样会更好。

    1. Autofac会自动为IDisposable对象调用dispose。如果你 需要配置方法,实现它。它与autofac无关。
    2. 如果您使用另一个线程解析此线程中的对象。否则,当处理请求时,您的对象将被处置,您的线程将失败。检查this