tnblog
首页
视频
资源
登录

用Autofac增强容器能力:引入面向切面编程(AOP)的能力

6240人阅读 2020/5/31 14:49 总访问:3660608 评论:0 收藏:0 手机
分类: .net后台框架

.netcore

用Autofac增强容器能力:引入面向切面编程(AOP)的能力


基本介绍


Autofac是.NET里IOC(Inversion of Control)容器的一种,同类的框架还有Spring.NET,Unity,Castle等。可以通过NuGet方式将其添加到项目中使用。

Autofac官方网站:http://autofac.org/


创建项目


项目目录

安装 Autofac 依赖包

autofac

安装 Autofac.Extras.DynamicProxy

  1. Install-Package Autofac.Extras.DynamicProxy -Version 5.0.0
  2. dotnet add package Autofac.Extras.DynamicProxy --version 5.0.0

安装 Autofac.Extensions.DependencyInjection

  1. Install-Package Autofac.Extensions.DependencyInjection -Version 6.0.0
  2. dotnet add package Autofac.Extensions.DependencyInjection --version 6.0.0

项目内容


WeatherForecastController.cs
  1. [ApiController]
  2. [Route("[controller]")]
  3. public class WeatherForecastController : ControllerBase
  4. {
  5. private readonly ILogger<WeatherForecastController> _logger;
  6. public WeatherForecastController(ILogger<WeatherForecastController> logger)
  7. {
  8. _logger = logger;
  9. }
  10. [HttpGet]
  11. public int Get([FromServices]IEnumerable<IMyService> list)
  12. {
  13. foreach (var item in list)
  14. {
  15. item.ShowCode();
  16. }
  17. return 0;
  18. }
  19. }
MyDI.cs
  1. public class MyDIServiceProviderFactory : IServiceProviderFactory<MyContainerBuilder>
  2. {
  3. public MyContainerBuilder CreateBuilder(IServiceCollection services)
  4. {
  5. return new MyContainerBuilder() { Services = services };
  6. }
  7. public IServiceProvider CreateServiceProvider(MyContainerBuilder containerBuilder)
  8. {
  9. return new MyServiceProvider(containerBuilder.Services.BuildServiceProvider());
  10. }
  11. }
  12. public class MyServiceProvider : IServiceProvider
  13. {
  14. IServiceProvider _serviceProvider;
  15. public MyServiceProvider(IServiceProvider serviceProvider)
  16. {
  17. _serviceProvider = serviceProvider;
  18. }
  19. public object GetService(Type serviceType)
  20. {
  21. Console.WriteLine($"正在创建对象:{serviceType.FullName}");
  22. return _serviceProvider.GetService(serviceType);
  23. }
  24. }
  25. public class MyContainerBuilder
  26. {
  27. internal IServiceCollection Services { get; set; }
  28. }
Interceptor.cs
  1. public class MyInterceptor : IInterceptor
  2. {
  3. public void Intercept(IInvocation invocation)
  4. {
  5. Console.WriteLine($"Intercept before,Method:{invocation.Method.Name}");
  6. invocation.Proceed();
  7. Console.WriteLine($"Intercept after,Method:{invocation.Method.Name}");
  8. }
  9. }
MyService.cs
  1. public interface IMyService
  2. {
  3. void ShowCode();
  4. }
  5. public class MyService : IMyService
  6. {
  7. public void ShowCode()
  8. {
  9. Console.WriteLine($"MyService.ShowCode:{GetHashCode()}");
  10. }
  11. }
  12. public class MyServiceV2 : IMyService
  13. {
  14. public MyNameService NameService { get; set; }
  15. public void ShowCode()
  16. {
  17. Console.WriteLine($"MyServiceV2.ShowCode:{GetHashCode()},NameService是否为空:{NameService == null}");
  18. }
  19. }
  20. public class MyNameService
  21. {
  22. }
Startup.cs
  1. public Startup(IConfiguration configuration)
  2. {
  3. Configuration = configuration;
  4. }
  5. public IConfiguration Configuration { get; }
  6. public void ConfigureServices(IServiceCollection services)
  7. {
  8. services.AddControllers().AddControllersAsServices();
  9. }
  10. public void ConfigureContainer(ContainerBuilder builder)
  11. {
  12. //builder.RegisterType<MyService>().As<IMyService>();
  13. #region 命名注册
  14. //builder.RegisterType<MyServiceV2>().Named<IMyService>("service2");
  15. #endregion
  16. #region 属性注册
  17. //builder.RegisterType<MyNameService>();
  18. //builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired();
  19. #endregion
  20. #region AOP
  21. // builder.RegisterType<MyInterceptor>();
  22. // builder.RegisterType<MyNameService>();
  23. // builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired().InterceptedBy(typeof(MyInterceptor)).EnableInterfaceInterceptors();
  24. #endregion
  25. #region 子容器
  26. //builder.RegisterType<MyNameService>().InstancePerMatchingLifetimeScope("myscope");
  27. #endregion
  28. }
  29. public ILifetimeScope AutofacContainer { get; private set; }
  30. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  31. {
  32. this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();
  33. #region 1,2,3
  34. // var servicenamed = this.AutofacContainer.Resolve<IMyService>();
  35. // servicenamed.ShowCode();
  36. //var service = this.AutofacContainer.ResolveNamed<IMyService>("service2");
  37. //service.ShowCode();
  38. #endregion
  39. #region 子容器
  40. using (var myscope = AutofacContainer.BeginLifetimeScope("myscope"))
  41. {
  42. var service0 = myscope.Resolve<MyNameService>();
  43. using (var scope = myscope.BeginLifetimeScope())
  44. {
  45. var service1 = scope.Resolve<MyNameService>();
  46. var service2 = scope.Resolve<MyNameService>();
  47. Console.WriteLine($"service1=service2:{service1 == service2}");
  48. Console.WriteLine($"service1=service0:{service1 == service0}");
  49. }
  50. }
  51. #endregion
  52. if (env.IsDevelopment())
  53. {
  54. app.UseDeveloperExceptionPage();
  55. }
  56. app.UseHttpsRedirection();
  57. app.UseRouting();
  58. app.UseAuthorization();
  59. app.UseEndpoints(endpoints =>
  60. {
  61. endpoints.MapControllers();
  62. });
  63. }
Program.cs
  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateHostBuilder(args).Build().Run();
  6. }
  7. public static IHostBuilder CreateHostBuilder(string[] args) =>
  8. Host.CreateDefaultBuilder(args)
  9. .UseServiceProviderFactory(new AutofacServiceProviderFactory())
  10. .ConfigureWebHostDefaults(webBuilder =>
  11. {
  12. webBuilder.UseStartup<Startup>();
  13. });
  14. }


基于名称的注入


修改Startup.cs


ConfigureContainer 方法

  1. builder.RegisterType<MyService>().As<IMyService>();
  2. #region 命名注册
  3. builder.RegisterType<MyServiceV2>().Named<IMyService>("service2");
  4. #endregion

Configure 方法

  1. var servicenamed = this.AutofacContainer.Resolve<IMyService>();
  2. servicenamed.ShowCode();
  3. var service = this.AutofacContainer.ResolveNamed<IMyService>("service2");
  4. service.ShowCode();

运行结果


属性注入


属性注入前

属性注入后


基于动态代理的AOP



子容器



其他


请大家自行感受,期待评论区分享简洁的认识当中的区别!助我成长!谢谢!


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

NET Core 使 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

使OLEDB读取不同版本Excel的连接字符串设置

使用OleBD读取excel的时候,excel不同的版本,连接字符串的写法也会不一样。///&lt;summary&gt; ///读取excel ///&lt;/su...

vs2017 对 COM 组件的调返回了错误 HRESULT E_FAIL

vs2017添加引用报错 对 COM 组件的调用返回了错误 HRESULT E_FAIL 1.以管理员身份打开vs2017开发人员命令指示符 2...

如何修改重置MD5加密后的SQL户密码

二次开发时,要加一个忘记密码的功能,后台写了修改密码的方法,数据库执行也修改成功,但是登录一直提示密码错误。之所以...

时间日期处理总结

时间处理是项目中不可缺少的,下面整理了一些常用时间处理的用法,记录一下。原文地址:https://blog.csdn.net/ohdajing/ar...

C ?、?? 问号和2个问号的法(类型?、对象?)

C# ?C# ???:单问号1.定义数据类型可为空。可用于对int,double,bool等无法直接赋值为null的数据类型进行null的赋值如这...

C out、ref关键字的法和区别

说说自己对out、ref的认识,面试问到的几率很高哟。out:classProgram { /* *out、ref都是引用传递,传递后使用都会改变...

C 使CancellationTokenSource取消多线程

有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消如下:...

使爬虫刷csdn博客访问量

首先了解一下常见反爬虫的检测方法频率监测:有些网站会设置一种频率监测的机制,对于同一IP,若在一定时间内访问的速度超...

Redis常命令

启动服务命令 redis-server.exe redis.windows.conf 连接命令 redis-cli.exe -h ip地址 -p 6379 连接本地...

Redis常配置

配置主从节点slaveof127.0.0.16379 可能会遇到持久化错误:Error reply to PING from master: ‘-MISCONF Redis is configu...

Idea下使maven搭建SSM(一)SpringMVC

Spring MVC是一款基于MVC架构模式的轻量级Web框架,其目的是将Web开发模块化,对整体架构进行解耦,简化Web开发流程。下面...

Idea下使maven搭建SSM(二)MyBatis

开发Web应用,数据的存储和处理往往离不开数据库和SQL语句。在使用Java开发的Web应用中,自然也少不了连接数据库的步骤。在...

的很厉害的工具

图片压缩相对图片无损放大来说是小kiss。下面是非常非常帅气的图片无损放大http://bigjpg.com/图片压缩https://www.upyun.c...

网页上传文件断点续传的实现,无视文件大小上传,以及datatables基本

首先明白js是客户带执行代码,c#是服务器上执行代码。本地文件需要用到js处理,服务器端接受c#代码处理1.HTML页面,文件信...

DIV+CSS网页布局常的一些基础知识整理

一.文件命名规范全局样式:global.css;框架布局:layout.css;字体样式:font.css;链接样式:link.css;打印样式:print...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术