添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

ASP.NET Core 使用Autofac

asp.net core 使用autofac

  1. 安装Autofac 和 Autofac.Extensions.DependencyInjection nuget包
  2. 修改 Program 类
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                    webBuilder.UseStartup<Startup>();
                });
  1. 修改 Startup 类,在该类中添加 ConfigureContainer 方法

属性介绍:
RegisterAssemblyTypes:寄存器程序集类型
AsImplementedInterfaces:实现的接口
InstancePerDependency:实例依赖关系
PropertiesAutowired:属性自动连接(属性自动注入)

        /// <summary>
        /// 配置Autofac容器替换微软的DI
        /// </summary>
        /// <param name="containerBuilder"></param>
        public void ConfigureContainer(ContainerBuilder builder)
            // 单个服务类注册
            builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();
            // 多个服务类,也就是程序集注册 //
            // 这是注册其他项目的程序集服务
            var basePath = AppContext.BaseDirectory;
            //DALService所在程序集命名空间
            string DALPath = Path.Combine(basePath, "GraduationProject.DAL.dll");
            Assembly DAL = Assembly.LoadFrom(DALPath);
            //BLLService所在程序集命名空间
            string BLLPath = Path.Combine(basePath, "GraduationProject.BLL.dll");
            Assembly BLL = Assembly.LoadFrom(BLLPath);
            builder.RegisterAssemblyTypes(DAL).InstancePerDependency().PropertiesAutowired();
            builder.RegisterAssemblyTypes(BLL).AsImplementedInterfaces().InstancePerDependency().PropertiesAutowired();
            // 这是注册同一项目下的程序集服务
            builder.RegisterAssemblyTypes(typeof(Program).Assembly)
            .Where(t => t.Name.EndsWith("Service"))
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope();

或者新建AutofacModelRegister 配置类

// 继承自 Autofac.Model    
public class AutofacModelRegister : Autofac.Module
      //重写Autofac管道Load方法,在这里注册注入
     protected override void Load(ContainerBuilder builder)
         // 配置逻辑同上
         builder.RegisterType<UserService>().As<IUserService>();
// 然后在startup类中新建ConfigureContainer方法,配置
public void ConfigureContainer(ContainerBuilder builder)
    // 直接用Autofac注册我们自定义的 
    builder.RegisterModule(new AutofacModuleRegister());
    // 服务项目程序集
    //Assembly service = Assembly.Load("XXX.Service");
    // 服务接口项目程序集
    //Assembly iservice = Assembly.Load("XXX.IService");
    //builder.RegisterAssemblyTypes(service, iservice).Where(t => t.FullName.EndsWith("Service") && !t.IsAbstract)
    //.InstancePerLifetimeScope()
    //.AsImplementedInterfaces();

注意:如果需要注入的服务没有 interface ,那么 builder.RegisterAssemblyTypes 就只需要传一个程序集就OK了。如果服务与接口同在一个项目,那也是要传两个程序集的哦。

  1. controller 中使用
    [ApiController]
    [Route("[controller]")]
    public class HomeController : ControllerBase
        private readonly IUserService _userService;
        public HomeController(IUserService userService)
            _userService = userService;
        [HttpGet]
        public IActionResult Index()
            return Ok(_userService.GetName("Test"));

属性自动注入

默认支持构造函数注入,如果需要属性注入,对比构造函数注入,属性注入就多追加了 **PropertiesAutowired() **函数
在这里插入图片描述

注意:属性注入记得将属性的访问修饰符改为注册类可访问的修饰符,否则会注入失败。
在这里插入图片描述

如果不是public 则会抛出空引用。
原因大概就是 Controller 是由 Mvc 模块管理的,不在 IOC 容器内,所以在 Controller 中无法使用 Autofac 注入的实例。

// 解决上面的问题,在 Startup 的 ConfigureServices 方法底部加入如下代码:
// 使用 ServiceBasedControllerActivator 替换 DefaultControllerActivator; // Controller 默认是由 Mvc 模块管理的,不在 Ioc 容器中。替换之后,将放在 Ioc 容器中。 
services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
// 然后回到我们的 AutofacModuleRegister 注入 Controller:
builder.RegisterTypes(GetAssemblyTypes<Startup>(type => typeof(ControllerBase).IsAssignableFrom(type)))                 .PropertiesAutowired();
将默认ServiceProviderFactory指定为AutofacServiceProviderFactory
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBu
前两节针对.NetCore自带的依赖注入进行简要概述,对于日常开发的需求应该是能满足了,那为什么还需要引入第三方依赖注入组件呢,这里就从自带的依赖注入来分析,有什么样的需求满足不了?主要归纳为以下几点:
属性注入:自带的依赖注入不支持属性注入方式,而现阶段开发,属性开发模式应该在程序中无处不在了;
	按名称注入:自带的依赖注入不支持名称注入,当注入多个同接口的不同实现时,要获取指定类型的对象不太方便,但通过名称可以方便获取;
	注册方式:自带的依赖注入需要指定具体类型,这样每增加一个新类型就要添加
				
第一步:在Nuget中安装Autofac包 第二步:在Nuget中安装Autofac.Extensions.DependencyInjection(MVC项目已经默认安装了,控制台应用程序需要安装) tartup类 在Startup类中,将ConfigureServices方法的返回值修改成IServiceProvider, 然后在这个方法中添加我们自定义...
(2)Program类中添加如下代码 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())//Step 1:容器替换 .ConfigureContainer<ContainerBuilder>(builder => //服务层程序集命名空间 Assembly userS... 通常我们写程序时所有的对象都由我们手动的new出来,这样项目之间互相依赖,各个模块之间耦合严重,当需要修改为其他实现类时非常麻烦。通过IOC可以解除依赖,让代码结构看起来更加合理,并能够提升项目的稳定性和可用性。 Autofac是IOC(Inversion of Control,控制反转)容器的一种,使用IOC容器一般建议基于接口编程。在使用的时候声明接口类型的变量、属性是由容器负责赋值... 1、哈喽大家中秋节(后)好呀!感觉已经好久没有写文章了,但是也没有偷懒哟,我的视频教程《系列一、NetCore 视频教程(Blog.Core)》也已经录制八期了,还在每周末同步更新中,欢迎大家多多指教。 2、除此之外呢,我也在平时的时间帮朋友开发了一个小项目,就是使用 .net mvc+vue+ele+mongo 框架写的项目,之前一直想着用mvc结合着vue写,这次也终于...
.NET 4.6 中使用 Autofac 与上面的示例类似,只需要稍微修改一下容器的创建方式即可。 1. 引入 Autofac 库。可以使用 NuGet 包管理器搜索并安装 Autofac。 2. 创建容器并注册服务和依赖关系: ```csharp var builder = new ContainerBuilder(); // 注册服务 builder.RegisterType<MyService>().As<IMyService>(); // 注册控制器 builder.RegisterType<MyController>(); // 创建容器 var container = builder.Build(); 3. 在需要使用依赖注入的地方,我们可以通过容器解析所需要的对象: ```csharp var myService = container.Resolve<IMyService>(); var myController = container.Resolve<MyController>(); 4. 当然,我们也可以通过构造函数注入所需要的依赖: ```csharp public class MyController private readonly IMyService _myService; public MyController(IMyService myService) _myService = myService; // ... 在 .NET 4.6 中使用 Autofac 的方式与 .NET Core 中略有不同,但主要思路是相同的。需要注意的是,Autofac.NET 4.6 中需要引入 System.Runtime.CompilerServices.Unsafe 库,否则会编译错误。