谈一谈autofac组件的实例范围

当使用 Autofac IoC 容器时,我们可以定义组件实例的生命周期或范围。实例的范围决定了何时和如何依赖注入。在 Autofac 中,我们可以通过显式设置作用域或使用默认的作用域来设置组件的生命周期。

Autofac 中的五种实例范围:

  • InstancePerDependency: 为每次依赖注入创建新的实例。
  • InstancePerLifetimeScope: 为每个 LifetimeScope 创建只有单个实例的组件。
  • InstancePerMatchingLifetimeScope: 为每个匹配的 LifetimeScope 创建只有单个实例的组件。(必须与 LifetimeScope 标记合作使用)
  • InstancePerRequest: RequestContext 终止时创建一次实例。
  • SingleInstance: 在容器生命周期内只创建一次实例。

当我们不显式设置组件的实例范围时,Autofac 的默认范围是 InstancePerDependency。即每次依赖注入时,都会在容器中创建一个新的实例。

下面我们来看两个示例:

  1. 使用 InstancePerLifetimeScope 来创建组件
class Demo
{
    private readonly IFoo _foo;
    private readonly IBar _bar;

    public Demo(IFoo foo, IBar bar)
    {
        _foo = foo;
        _bar = bar;
    }

    public void DoSomething() { ... }
}

containerBuilder.RegisterType<Foo>().As<IFoo>().InstancePerLifetimeScope();
containerBuilder.RegisterType<Bar>().As<IBar>().InstancePerLifetimeScope();

using (var scope = container.BeginLifetimeScope())
{
    var demo = scope.Resolve<Demo>();
    demo.DoSomething();
}

在这个示例中,我们将 IFoo 和 IBar 注册为 InstancePerLifetimeScope 的生命周期。当我们创建组件的 LifetimeScope 时,Foo 和 Bar 只会被实例化一次。然后我们可以使用 Resolve() 方法来获取 Demo 组件的一个实例,并调用 DoSomething() 方法。

  1. 使用 InstancePerRequest 来创建组件

如果您在 ASP.NET 中使用 Autofac,那么您选择的最佳作用域和生命周期将是 InstancePerRequest 生命周期。这样,每个 HTTP 请求都会创建一个 RequestLifetimeScope,以确保在请求期间创建的组件都能及时释放和清理。下面是一个使用 InstancePerRequest 来创建组件的示例:

public class DemoController : Controller
{
    private readonly IFoo _foo;

    public DemoController(IFoo foo)
    {
        _foo = foo;
    }

    public ActionResult Index()
    {
        ...
    }
}

containerBuilder.RegisterType<Foo>().As<IFoo>().InstancePerRequest();

//在 Global.asax.cs 中设置
protected void Application_BeginRequest(object sender, EventArgs e)
{
    var context = new HttpContextWrapper(HttpContext.Current);
    var lifetimeScope = container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag, builder =>
    {
        builder.Register(c => context).As<HttpContextBase>().InstancePerRequest();
    });
    LifetimeScopeProvider.SetLifetimeScope(lifetimeScope);
}

protected void Application_EndRequest(object sender, EventArgs e)
{
    var lifetimeScope = LifetimeScopeProvider.GetLifetimeScope();
    lifetimeScope?.Dispose();
}

在这个示例中,我们在 DemoController 中使用 IFoo,并将其注册为 InstancePerRequest 的生命周期。然后,我们在 Global.asax.cs 中使用 BeginLifetimeScope() 来为 ASP.NET 请求创建 LifetimeScope。自动释放生命周期作用域时,请确保在 DefaultModelBinder 或类似浅析工具不再需要它们时在 HttpContextBase 中设置它们以释放注入的组件。

这就是关于 Autofac 组件生命周期范围的简单介绍,您可以选择最适合您应用程序的范围进行组件注册。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:谈一谈autofac组件的实例范围 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#Web应用程序入门经典学习笔记之一

    C#Web应用程序入门经典学习笔记之一学习攻略 C#Web应用程序入门经典学习笔记之一是一本入门级别的C#网络开发学习笔记,主要介绍了通过ASP.NET Core Web应用程序搭建Web应用程序的基础知识和应用。本学习攻略将介绍如何学习这本书并深入理解其内容。 一、先了解一下ASP.NET Core Web应用程序 在开始学习这本书之前,我们需要先简单了解…

    C# 2023年6月1日
    00
  • 基于C#实现的木马程序实例详解

    基于C#实现的木马程序实例详解 本文将介绍如何使用C#编写一个基本的木马程序。木马程序可以在用户不知情的情况下窃取他们的信息、操纵他们的计算机等。我们不鼓励使用木马程序进行非法的活动,但是对于理解计算机安全和保护计算机安全有很大帮助。 初学者指南 在开始编写你的木马程序之前,请确保你已经掌握了以下技能: 熟悉C#的基本语法和面向对象的编程思想 对于计算机网络…

    C# 2023年6月7日
    00
  • 深入浅出23种设计模式

    深入浅出23种设计模式完整攻略 介绍 设计模式是指在软件设计中,为了解决特定问题而被反复使用的一种解决方案。23种设计模式包括创建型、结构型和行为型三种类型,每种类型包括若干个具体的设计模式。本文将详细讲解23种设计模式的原理、实现方法和具体应用场景,以及两个示例说明。 创建型模式 单例模式 单例模式保证一个类只有一个实例,并提供全局访问点。常用于资源访问、…

    C# 2023年6月7日
    00
  • 使用C#实现在屏幕上画图效果的代码实例

    下面是使用C#实现在屏幕上画图效果的完整攻略。 目录 准备工作 绘制线段 绘制多边形 示例说明一:绘制简单的三角形 示例说明二:绘制带填充的矩形 准备工作 在C#中,我们可以通过System.Drawing命名空间下的Graphics类来实现在屏幕上的画图效果。在使用之前,需要进行如下准备工作: 引用命名空间 using System.Drawing; 创建…

    C# 2023年6月6日
    00
  • C#获取指定目录下指定文件的方法

    下面是关于“C#获取指定目录下指定文件的方法”的完整攻略。 第一步:引用命名空间 在进行相关操作之前,需要引用System.IO命名空间,这个命名空间提供了用于操作文件和文件夹的类和接口。 using System.IO; 第二步:获取指定目录下的所有文件列表 可以使用Directory.GetFiles()方法来获取指定目录下的所有文件列表,该方法返回一个…

    C# 2023年6月1日
    00
  • .NET Core系列之MemoryCache 缓存选项

    .NET Core系列之MemoryCache 缓存选项 在.NET Core中,MemoryCache是一种内存缓存,可用于缓存应用程序中的数据。MemoryCache提供了多种缓存选项,可以根据应用程序的需求进行配置。本攻略将介绍MemoryCache的缓存选项,包括缓存过期、缓存优先级、缓存回调等,并提供两个示例说明。 缓存过期 在MemoryCach…

    C# 2023年5月16日
    00
  • C#利用OLEDB实现将DataTable写入Excel文件中

    下面我将详细讲解“C#利用OLEDB实现将DataTable写入Excel文件中”的完整攻略。 1. OLEDB介绍 OLE DB 是一种标准的连接方式,支持多种数据库和文件格式,可以用于访问关系数据库、普通数据文件、Excel 和文本文件等。OLE DB 的本质是一种支持 COM 的面向 ROWSET 的标准,应用可以通过 OLE DB 访问所有遵守本标准…

    C# 2023年5月31日
    00
  • ASP.NET MVC通过勾选checkbox更改select的内容

    以下是“ASP.NET MVC通过勾选checkbox更改select的内容”的完整攻略: 什么是ASP.NET MVC通过勾选checkbox更改select内容 ASP.NET MVC通过勾选更改的内容是一种机制,允许开发人员在MVC视图页中使用jQuery根据勾的checkbox更改select的内容。这种制可以帮助开发人员更轻松地处理用户交互,并提高…

    C# 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部