架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 843|回复: 0

[.NET Core] ASP.NET Core使用Autofac两种方式实现IOC注入

[复制链接]
跳转到指定楼层
楼主
发表于 2019-5-7 16:32:23
zu
ASP.NET Core依赖注入使用自带的IOC容器
https://www.itsvse.com/thread-7562-1-1.html
(出处: 架构师_程序员)

ASP.NET Core使用Autofac实现IOC注入
https://www.itsvse.com/thread-7563-1-1.html
(出处: 架构师_程序员)

ASP.NET Core使用Autofac实现AOP拦截
https://www.itsvse.com/thread-7566-1-1.html
(出处: 架构师_程序员)

ASP.NET Core中自带的IOC容器是属于轻量级的,功能并不是很多,只是提供了基础功能而已。

本文将使用Autofac通过构造函数和属性注入两种方式讲解。

Autofac 是一款适用于Microsoft .NET 4.5, Silverlight 5, Windows Store apps, and Windows Phone 8 apps的超赞的 IoC 容器 . 它可以管理类之间的依赖关系从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 . 通过将常规.net类当做 组件 处理实现 .

项目.net core版本为:2.1.301

安装Autofac.Extensions.DependencyInjection

通过nuget来安装,命令如下:

  1. Install-Package Autofac.Extensions.DependencyInjection -Version 4.4.0
复制代码


我们随便写了3个接口和3个实现类,如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;

  5. namespace BaiDuPan.WebUI
  6. {
  7.     public interface IBaseTestService
  8.     {
  9.         string GetString();
  10.     }

  11.     public interface ITestService1: IBaseTestService { }
  12.     public interface ITestService2 : IBaseTestService { }
  13.     public interface ITestService3 : IBaseTestService { }

  14.     public class TestService1 : ITestService1
  15.     {
  16.         private string str { get; set; }
  17.         public TestService1()
  18.         {
  19.             str = Guid.NewGuid().ToString();
  20.         }
  21.         public string GetString()
  22.         {
  23.             return str;
  24.         }
  25.     }

  26.     public class TestService2 : ITestService2
  27.     {
  28.         private string str { get; set; }
  29.         public TestService2()
  30.         {
  31.             str = Guid.NewGuid().ToString();
  32.         }
  33.         public string GetString()
  34.         {
  35.             return str;
  36.         }
  37.     }

  38.     public class TestService3 : ITestService3
  39.     {
  40.         private string str { get; set; }
  41.         public TestService3()
  42.         {
  43.             str = Guid.NewGuid().ToString();
  44.         }
  45.         public string GetString()
  46.         {
  47.             return str;
  48.         }
  49.     }
  50. }
复制代码


控制器构造函数注入

首先,我们修改Startup中的ConfigureServices代码如下:

  1. public IServiceProvider ConfigureServices(IServiceCollection services)
  2. {
  3.         services.Configure<CookiePolicyOptions>(options =>
  4.         {
  5.                 // This lambda determines whether user consent for non-essential cookies is needed for a given request.
  6.                 options.CheckConsentNeeded = context => true;
  7.                 options.MinimumSameSitePolicy = SameSiteMode.None;
  8.         });

  9.         services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  10.         //添加数据库上下文和配置数据库连接字符串
  11.         PanDb.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
  12.         services.AddDbContext<PanDb>();


  13.         var builder = new ContainerBuilder();
  14.         builder.Populate(services);//Autofac.Extensions.DependencyInjection

  15.         //服务
  16.         builder.RegisterType<TestService1>().As<ITestService1>();
  17.         builder.RegisterType<TestService2>().As<ITestService2>();
  18.         builder.RegisterType<TestService3>().As<ITestService3>();

  19.         return new AutofacServiceProvider(builder.Build());
  20. }
复制代码
注意:这里把ConfigureServices返回值void修改成了IServiceProvider。

控制器代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Microsoft.AspNetCore.Mvc;
  7. using BaiDuPan.WebUI.Models;

  8. namespace BaiDuPan.WebUI.Controllers
  9. {
  10.     public class HomeController : Controller
  11.     {

  12.         private readonly ITestService1 _testService1;
  13.         private readonly ITestService2 _testService2;
  14.         private readonly ITestService3 _testService3;

  15.         public HomeController(ITestService1 testService1, ITestService2 testService2, ITestService3 testService3)
  16.         {
  17.             _testService1 = testService1;
  18.             _testService2 = testService2;
  19.             _testService3 = testService3;
  20.         }

  21.         //采用了Action注入的方法
  22.         public IActionResult Index()
  23.         {
  24.             ViewBag.Str1 = _testService1.GetString();
  25.             ViewBag.Str2 = _testService2.GetString();
  26.             ViewBag.Str3 = _testService3.GetString();
  27.             return View();
  28.         }
  29.     }
  30. }
复制代码
运行项目,如下图:



控制器Autofac属性注入

修改Startup中的ConfigureServices方法,如下:

  1. public IServiceProvider ConfigureServices(IServiceCollection services)
  2. {
  3.         services.Configure<CookiePolicyOptions>(options =>
  4.         {
  5.                 // This lambda determines whether user consent for non-essential cookies is needed for a given request.
  6.                 options.CheckConsentNeeded = context => true;
  7.                 options.MinimumSameSitePolicy = SameSiteMode.None;
  8.         });

  9.         services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddControllersAsServices(); ;
  10.         //添加数据库上下文和配置数据库连接字符串
  11.         PanDb.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
  12.         services.AddDbContext<PanDb>();

  13.         var builder = new ContainerBuilder();
  14.         builder.Populate(services);//Autofac.Extensions.DependencyInjection

  15.         //注册服务
  16.         builder.RegisterType<TestService1>().As<ITestService1>().PropertiesAutowired();
  17.         builder.RegisterType<TestService2>().As<ITestService2>().PropertiesAutowired();
  18.         builder.RegisterType<TestService3>().As<ITestService3>().PropertiesAutowired();

  19.         //注册所有控制器
  20.         var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
  21.         .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
  22.         builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
  23.         return new AutofacServiceProvider(builder.Build());
  24. }
复制代码
控制器代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Microsoft.AspNetCore.Mvc;
  7. using BaiDuPan.WebUI.Models;

  8. namespace BaiDuPan.WebUI.Controllers
  9. {
  10.     public class HomeController : Controller
  11.     {
  12.         public ITestService1 _testService1 { get; set; }
  13.         public ITestService2 _testService2 { get; set; }
  14.         public ITestService3 _testService3 { get; set; }


  15.         public IActionResult Index()
  16.         {
  17.             ViewBag.Str1 = _testService1.GetString();
  18.             ViewBag.Str2 = _testService2.GetString();
  19.             ViewBag.Str3 = _testService3.GetString();
  20.             return View();
  21.         }
  22.     }
  23. }
复制代码
运行项目,如下图:



注意要点:

  • services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddControllersAsServices();
  • public ITestService1 _testService1 { get; set; }


由于,我一开始把服务接口设置private私有的了,造成注入总是null。

参考资料:https://docs.autofac.org/en/latest/integration/aspnetcore.html




上一篇:ASP.NET Core依赖注入使用自带的IOC容器
下一篇:ASP.NET Core ILogger日志使用教程
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-9-19 01:53

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表