基于autofac的属性注入

什么是属性注入

在了解属性注入之前,要先了解一下DI(Dependency Injection),即依赖注入。在ASP.NET Core里自带了一个IOC容器,而且程序支行也是基于这个容器建立起来的,在 Startup 里的 ConfigureService 方法里向容器注册服务类型。

简单来说,依赖注入就是容器帮我们“new”一个对象,并且管理对象的生命周期。

在依赖注入时,最常用的是构造方法注入。还有另一种方法,那就是属性注入

在ASP.NET Core中,自带的容器是不支持属性注入的,但是可以通过替换容器来实现,也就是今天介绍的:通过 Autofac 来实现属性注入。

autofac简介

Autofac 是一款超赞的.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 . 它的实现方式是将常规的.net类当做 组件 处理.

中文文档:https://autofaccn.readthedocs.io/zh/latest/

为什么要使用属性注入

主要有以下三点:

  1. 减少常用类型的重复注入代码,使构造方法看起来更为简洁,提高阅读性。
  2. 减少或消除因构造方法注入造成子类继承后的 base 调用链。
  3. 并非是满足第一条或第二条就需要使用属性注入来解决,只有当第一、二条发生的情况到达一定的数量。

具体实现

1、引用类库

Autofac
Autofac.Extensions.DependencyInjection

2、在 Program.cs 里替换系统默认容器

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) // 使用 autofac 的容器工厂替换系统默认的容器
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});

3、在 Startup.csConfigureServices 里替换控制器的替换规则

public void ConfigureServices(IServiceCollection services)
{
// 替换控制器的替换规则
services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>()); // other configure
services.AddControllers();
}

4、创建 AutowiredAttribute.cs ,用于标识使用属性注入

[AttributeUsage(AttributeTargets.Property)]
public class AutowiredAttribute : Attribute
{
}

5、创建 AutofacModule.cs ,注册服务

/// <summary>
/// 容器注册类
/// </summary>
public class AutofacModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
// Register your own things directly with Autofac, like:
builder.RegisterType<HelloService>().As<IHelloService>().InstancePerDependency().AsImplementedInterfaces(); // 获取所有控制器类型并使用属性注入
var controllerBaseType = typeof(ControllerBase);
builder.RegisterAssemblyTypes(typeof(Program).Assembly)
.Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
.PropertiesAutowired(new AutowiredPropertySelector());
}
} /// <summary>
/// 属性注入选择器
/// </summary>
public class AutowiredPropertySelector : IPropertySelector
{
public bool InjectProperty(PropertyInfo propertyInfo, object instance)
{
// 带有 AutowiredAttribute 特性的属性会进行属性注入
return propertyInfo.CustomAttributes.Any(it => it.AttributeType == typeof(AutowiredAttribute));
}
}

6、在 Startup.cs 的 方法 ConfigureContainer 里注册上一步创建的 Module

// ConfigureContainer is where you can register things directly
// with Autofac. This runs after ConfigureServices so the things
// here will override registrations made in ConfigureServices.
// Don't build the container; that gets done for you. If you
// need a reference to the container, you need to use the
// "Without ConfigureContainer" mechanism shown later.
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule(new AutofacModule());
}

示例代码下载:源码

使用效果

[Autowired]
private IHelloService HelloService { get; set; }

在控制器里添加服务属性,然后添加 [Autowired] 特性标识为属性注入即可。

关于属性注入的注意事项

属性注入很好用,但是要慎重使用,因为属性注入会造成类型的依赖关系隐藏,测试不友好等。

建议:在封闭框架时可以使用,但不能大范围使用,只有必须使用属性注入来达到效果的地方才会使用,用来提高使用框架时的编码效率,来达到一些便利,脱离框架层面,编写业务代码时,不得使用。

参考资料

主要参考文章:

使用 autofac 实现 asp .net core 的属性注入

ASP.NETCore 3.0 Autofac替换及控制器属性注入及全局容器使用 - 情·深 - 博客园

autofac 的官方示例:

autofac/Examples: Example projects that consume and demonstrate Autofac IoC functionality and integration

autofac 文档:

Welcome to Autofac’s documentation! — Autofac 5.2.0 documentation

欢迎来到 Autofac 中文文档! — Autofac 4.0 文档

其它:

ASP.NET Core 奇淫技巧之伪属性注入 - 晓晨Master - 博客园

.net core2.0下Ioc容器Autofac使用 - 焰尾迭 - 博客园

基于autofac的属性注入的更多相关文章

  1. Autofac 的属性注入,IOC的坑

    Autofac 是一款优秀的IOC的开源工具,完美的适配.Net特性,但是有时候我们想通过属性注入的方式来获取我们注入的对象,对不起,有时候你还真是获取不到,这因为什么呢? 1.你对Autofac 不 ...

  2. 基于AspectCore打造属性注入

    前言 源自于晓晨在成都.net社区群的一篇文章 <晓晨的ASP.NET Core 奇淫技巧之伪属性注入> 他的思路是 Ioc容器替换 ControllerActivator,因为只能在控制 ...

  3. Autofac 的属性注入方式

    介绍 该篇文章通过一个简单的 ASP.NET MVC 项目进行介绍如何使用 autofac 及 autofac 的 MVC 模块进行依赖注入.注入方式通过构造函数.在编写 aufofac 的依赖注入代 ...

  4. ASP.NET Core中使用Autofac进行属性注入

    一些无关紧要的废话: 作为一名双修程序员(自封的),喜欢那种使用Spring的注解形式进行依赖注入或者Unity的特性形式进行依赖注入,当然,形式大同小异,但结果都是一样的,通过属性进行依赖注入. A ...

  5. WebAPI2使用Autofac实现IOC属性注入完美解决方案

    一.前言 只要你是.NETer你一定IOC,IOC里面你也会一定知道Autofac,上次说了在MVC5实现属性注入,今天实现在WebApi2实现属性注入,顺便说一下autofac的程序集的注入方式,都 ...

  6. .NET领域最为流行的IOC框架之一Autofac WebAPI2使用Autofac实现IOC属性注入完美解决方案 AutoFac容器初步

    .NET领域最为流行的IOC框架之一Autofac   一.前言 Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程 ...

  7. ASP.NETCore 3.0 Autofac替换及控制器属性注入及全局容器使用

    1.Autofac基础使用 参考: https://www.cnblogs.com/li150dan/p/10071079.html 2.ASP.NETCore 3.0 Autofac 容器替换 需要 ...

  8. .net core番外第2篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入

    本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果. 前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html 正文: Autof ...

  9. Java框架spring 学习笔记(六):属性注入

    属性注入:创建对象的时候,向类里面的属性设置值. Java属性注入有三种方法: 使用set方法注入 有参数构造注入 使用接口注入 Spring框架里面的属性注入方式 有参数构造属性注入 set方法属性 ...

随机推荐

  1. mysql 查询,天,周,月等写法

    1.查询当天的数据 select * from 表名 where TO_DAYS(时间字段)=TO_DAYS(NOW()); 2.查询当周的数据 select * from 表名 where YEAR ...

  2. SpringBoot 全局视角看springboot

    从单体架构到微服务 单体架构 任何一个网站在发布初期几乎都不可能立马就拥有庞大的用户流量和海量数据,都是在不停 的试错过程中一步一步演变其自身架构,满足其自身业务.比如现在能够抗住双十一这么大 流量的 ...

  3. MarkDown(文本编译器)

    MarkDown(一种高效的文本编译器) 推荐使用Typora 点击此处下载 使用方法 1. 首先创建一个文本文件xxx.txt. 2. 然后修改文件后缀为xxx.md.(可以记做玛德...) 3. ...

  4. codepen 上25个最受欢迎的HTML/CSS代码

    Codepen是一个非常了不起的网站,优设哥在设计师网址导航上也大力推荐过,得到了很多同学的喜爱,也是全球web前端开发人员的圣地! 我搜索了一些时下最好最流行的codepen(仅限于HTML和CSS ...

  5. Linux 创建/编辑/查看 文件/文件夹的命令汇总

    Linux 创建/编辑/查看 文件/文件夹的命令汇总 Linux 创建文件的命令Linux,编辑文件的命令Linux 查看文件的命令,touch,vim,vi,gedit,cat,ls -a, ls ...

  6. node --experimental-modules & node.js ES Modules

    node --experimental-modules & node.js ES Modules how to run esm modules in node.js cli $ node -v ...

  7. queueMicrotask & EventLoop & macrotask & microtask

    queueMicrotask https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/queueMicro ...

  8. js 动态构建style

    使用创建style的方式 btn.addEventListener("click", async () => { const ns = document.createElem ...

  9. NGK公链DeFi发力,Baccarat项目引爆流动性挖矿热潮

    DeFi市值屡创新高,在这条康庄大道上,人们摩拳擦掌,就像90年代美国西部淘金热一般.DeFi带来的流动性挖矿构成了今年加密货币一道靓丽的风景线,而人们手握的不再是当年的锄头铲子,而是一串代码. 随着 ...

  10. 在.NET Core 中使用 FluentValidation 进行规则验证

    不用说,规则验证很重要,无效的参数,可能会导致程序的异常. 如果使用Web API或MVC页面,那么可能习惯了自带的规则验证,我们的控制器很干净: public class User { [Requi ...