谈一谈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# TreeNode案例详解

    下面是详细讲解“C# TreeNode案例详解”的完整攻略。 1. 概述 在使用 C# 编写 WinForm 窗体程序时,经常会使用 TreeView 控件来实现树形结构的展示。而 TreeView 控件中的节点则是通过 TreeNode 类来表示的。本文将详细介绍如何使用 C# 中的 TreeNode 类来实现一个简单的树形结构。 2. 创建根节点 要创建…

    C# 2023年6月7日
    00
  • ajax跨域调用webservice的实现代码

    要实现ajax跨域调用webservice,我们需要使用JSONP或CORS技术。JSONP是一种通过动态创建script标签来实现跨域请求的技术,而CORS是一种通过在服务器端设置响应头来实现跨域请求的技术。本文将提供详解“ajax跨域调用webservice的实现代码”的完整攻略,包括如何使用JSONP和CORS技术实现跨域请求。 使用JSONP实现跨域…

    C# 2023年5月15日
    00
  • Windows系统中使用C#编写蓝牙通信程序的简单实例

    要在Windows系统中使用C#编写蓝牙通信程序,需要以下步骤: 步骤一:安装必要的开发环境 首先需要安装Visual Studio开发环境,版本最好是2015以上,也需要安装.NET Framework,版本最好是4.0以上。 步骤二:添加蓝牙开发包 需要在Visual Studio中添加蓝牙开发包,具体操作如下: 打开Visual Studio,新建项目…

    C# 2023年6月3日
    00
  • C# Path类—文件路径解读

    下面我会详细讲解一下“C# Path类—文件路径解读”的完整攻略。 国际标准的文件路径表示法 在不同的操作系统中,文件路径的表示方法是不一样的。不过,国际标准的文件路径表示方法是“/”符号作为分隔符。例如,在Windows系统中,路径分隔符使用的是“\”,但使用标准的文件路径表示法时,应该使用“/”作为分隔符。 C#中Path类的作用 Path类是.NE…

    C# 2023年6月1日
    00
  • C#如何更改Word的语言设置

    我来为你详细讲解如何使用C#更改Word的语言设置。 1. Word语言设置的基本知识 在开始使用C#编程更改Word的语言设置之前,我们需要先了解一些基本概念和知识。 Word语言设置分为三个部分:界面语言、编辑语言和默认语言。 界面语言:指Word的菜单、工具栏、对话框等界面显示的语言。 编辑语言:指Word用于检查拼写和语法的语言。 默认语言:指Wor…

    C# 2023年6月1日
    00
  • c#二维码生成的代码分享

    下面是关于“C#二维码生成的代码分享”的完整攻略: 目录 前言 准备工作 安装QRCoder 使用QRCoder生成二维码 示例说明 前言 随着移动应用和微信公众号的普及,二维码已经成为了一个不可或缺的元素。今天,我们就来学习一下如何使用C#来生成二维码。 准备工作 在开始之前,我们需要确保以下几个条件: 你已经安装了Visual Studio 2017或更…

    C# 2023年6月7日
    00
  • ThreadLocal 在上下文传值场景实践源码

    ThreadLocal 是 Java 中常用的多线程编程技术之一,它可以在多个线程环境中保存并传递数据,将数据与线程绑定在一起,实现线程的局部变量。在一些上下文传值的场景中,ThreadLocal 可以较为方便的实现参数的传递。接下来,本文将详细讲解 ThreadLocal 在上下文传值场景实践源码的完整攻略。 什么是 ThreadLocal ThreadL…

    C# 2023年6月7日
    00
  • CMD下读取/修改/删除注册表项的方法

    在CMD下读取、修改、删除注册表项可以使用reg命令来完成,reg命令是Windows系统自带的命令。 1. 读取注册表项 要读取一个注册表项,使用reg query命令。下面是reg query命令的语法: reg query "<注册表项路径>" 例如,要读取计算机的Windows版本,可以运行以下命令: reg quer…

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