谈一谈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#中explicit与implicit的深入理解

    C#中的explicit(显式转换)和implicit(隐式转换)主要是用来进行类型转换的。下面我将详细讲解这两种类型转换的深入理解以及使用示例。 显式转换 explicit 显式转换也就是强制类型转换,可以将整型强制转换为浮点型,或者可以将长整型转换为整型等等。显式转换需要使用类型转换运算符,可以直接把一个数据类型转换成另外一个数据类型,但如果转换时发生精…

    C# 2023年5月15日
    00
  • C# Winfrom实现Skyline画直线功能的示例代码

    让我为您详细讲解“C# Winfrom实现Skyline画直线功能的完整攻略”: 1. 确定需求 在开始编写代码前,首先要确定我们的需求就是实现Skyline功能,即在Windows窗体中画直线。 2. 创建Windows窗体应用程序 根据需求,我们需要创建一个Windows窗体应用程序。可以在Visual Studio中选择新建项目,选择“WindowsF…

    C# 2023年6月6日
    00
  • C#通过不安全代码看内存加载的示例详解

    让我来给大家详细讲解一下“C#通过不安全代码看内存加载的示例详解”的完整攻略。 标题 在开始之前,我们需要给这篇攻略一个标准的标题。根据通常的写作规范,一个良好的标题应该简洁、直观、准确地表达文章的主要内容。因此,我们可以采用如下的格式来给这篇攻略取一个合适的标题: C#通过不安全代码看内存加载的示例详解 内容 在正式讲解之前,我们需要了解一下什么是不安全代…

    C# 2023年5月15日
    00
  • C# 泛型集合的自定义类型排序的实现

    针对“C# 泛型集合的自定义类型排序的实现”的完整攻略,我们可以分为以下几个步骤来展开: 自定义类型实现 IComparable 接口 使用 Comparer 类进行排序 示例说明 下面我们一一进行详解。 自定义类型实现 IComparable 接口 首先,为了让我们自定义的类型可以进行排序,我们需要让它实现 System.IComparable 接口。具体…

    C# 2023年6月1日
    00
  • C#自定义序列化ISerializable的实现方法

    C# 中的自定义序列化可以通过实现ISerializable接口来实现。该接口要求实现GetObjectData(SerializationInfo info, StreamingContext context)和带有反序列化逻辑的构造函数。下面是具体实现方法的完整攻略: 1. 实现 ISerializable 接口 [Serializable] publi…

    C# 2023年5月15日
    00
  • 深入浅析C# 11 对 ref 和 struct 的改进

    深入浅析C# 11 对 ref 和 struct 的改进 简介 C# 11 是微软新推出的一项编程语言的更新版本,其中包含了对于 ref 和 struct 的一些优化改进。此次改进旨在提高代码的运行效率并降低代码运行的堆内存的占用。为了能够更好地理解这些改进,需要先了解 ref 和 struct 的相关知识。 ref 和 struct 在 C# 中,ref …

    C# 2023年6月6日
    00
  • C#算法之整数反转

    C#算法之整数反转 1. 题目描述 给定一个32位有符号整数,将其进行反转,返回反转后的整数。 例如: 输入:123 输出:321 输入:-123 输出:-321 输入:120 输出:21 2. 解题思路 我们可以通过将给定整数进行取余操作,不断得到末尾数字,再将其添加到反转后的数的末尾。此外,每次取余操作后,将原数除以10可以将最后一位去掉。 对于正数,一…

    C# 2023年6月7日
    00
  • asp.net动态产生checkbox(数据源为DB或内存集合)

    Sure,下面是详细讲解“asp.net动态产生checkbox(数据源为DB或内存集合)”的完整攻略。 使用内存集合作为数据源 步骤一:在页面中定义一个Panel控件 在aspx页面中定义一个Panel控件,用于放置动态生成的Checkbox控件,如下所示: <asp:Panel ID="panel1" runat="s…

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