.NET Core3.0 Autofac注入
2023-09-27 14:21:27 时间
参考地址:https://docs.autofac.org/en/latest/examples/index.html
1. nuget :Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy
2.
using System.IO; using Autofac.Extensions.DependencyInjection; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; namespace DL.Admin { public class Program { public static void Main(string[] args) { Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder .UseContentRoot(Directory.GetCurrentDirectory()) .UseUrls("http://*:2020") .UseStartup<Startup>(); }); } } }
3. 启动文件Startup.cs内部添加以下方法
public void ConfigureContainer(ContainerBuilder builder) { //添加任何Autofac模块或注册。 //这是在ConfigureServices之后调用的,所以 //在此处注册将覆盖在ConfigureServices中注册的内容。 //在构建主机时必须调用“UseServiceProviderFactory(new AutofacServiceProviderFactory())”`否则将不会调用此。 builder.RegisterModule(new AutofacModuleRegister(Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath, new List<string>() { //批量构造函数注入 "DL.Service.dll", })); builder.RegisterType<Log4netService>() .As<ILogService>() .PropertiesAutowired()//开始属性注入 .InstancePerLifetimeScope();//即为每一个依赖或调用创建一个单一的共享的实例 builder.RegisterType<JwtService>() .As<ITokenService>() .PropertiesAutowired()//开始属性注入 .InstancePerLifetimeScope();//即为每一个依赖或调用创建一个单一的共享的实例 }
3. 创建下面类,进行批量注入
using Autofac; using Autofac.Extras.DynamicProxy; using System.Collections.Generic; using System.IO; using System.Reflection; using Module = Autofac.Module; namespace DL.Utils.Autofac { public class AutofacModuleRegister : Module { public string RootPath { get; set; } public List<string> DllFiles { get; set; } public AutofacModuleRegister(string rootPath, List<string> dllFiles) { RootPath = rootPath; DllFiles = dllFiles; } protected override void Load(ContainerBuilder builder) { foreach (var dllFile in DllFiles) { var dllFilePath = Path.Combine(RootPath, dllFile);//获取项目绝对路径 builder.RegisterAssemblyTypes(Assembly.LoadFile(dllFilePath))//直接采用加载文件的方法 //.PropertiesAutowired()//开始属性注入 //.Where(t => t.Name.EndsWith("Service") || t.Name.EndsWith("Repository")) .AsImplementedInterfaces()//表示注册的类型,以接口的方式注册不包括IDisposable接口 .EnableInterfaceInterceptors()//引用Autofac.Extras.DynamicProxy,使用接口的拦截器,在使用特性 [Attribute] 注册时,注册拦截器可注册到接口(Interface)上或其实现类(Implement)上。使用注册到接口上方式,所有的实现类都能应用到拦截器。 .InstancePerLifetimeScope();//即为每一个依赖或调用创建一个单一的共享的实例 } ////拦截器 ////builder.Register(c => new AOPTest()); ////注入类 ////builder.RegisterType<UsersService>().As<UsersIService>().PropertiesAutowired().EnableInterfaceInterceptors(); ////程序集注入 //var IRepository = Assembly.Load("DL.IRepository"); //var Repository = Assembly.Load("DL.Repository"); //Assembly.GetExecutingAssembly(); ////根据名称约定(仓储层的接口和实现均以Repository结尾),实现服务接口和服务实现的依赖 //builder.RegisterAssemblyTypes(IRepository, Repository) // .Where(t => t.Name.EndsWith("Repository")) // .AsImplementedInterfaces(); } } }
4. Startup.cs的ConfigureServices 方法添加
services.AddControllersWithViews() .AddControllersAsServices();//这里要写
4. Startup.cs的Configure 方法添加进行测试
using (var container = host.Services.CreateScope()) { //ICacheService phone = container.ServiceProvider.GetService<ICacheService>(); //phone.Set<string>("1", "123"); ILogService log = container.ServiceProvider.GetService<ILogService>(); log.Debug(typeof(string), "mesg", new[] { "1", "2" }); //var str = phone.Get<string>("1"); IService.SysIservice.ISysAdminService sysAdminService = container.ServiceProvider.GetService<IService.SysIservice.ISysAdminService>(); var list = sysAdminService.GetListAsync(); }
相关文章
- Math.NET Numerics Matrices and Vectors
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
- ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
- 通过源码了解ASP.NET MVC 几种Filter的执行过程 在Winform中菜单动态添加“最近使用文件”
- .NET领域最为流行的IOC框架之一Autofac WebAPI2使用Autofac实现IOC属性注入完美解决方案 AutoFac容器初步
- MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式
- ASP.NET CORE系列【四】基于Claim登录授权
- 从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程
- Word控件Spire.Doc 【表单域】教程(四):如何在 C#、VB.NET 中删除自定义属性字段
- Aspose.Words for .NET使用表格教程之水平和垂直合并表格中单元格
- c#.net SQL存储过程直接传表;用户定义表类型的表
- 使用lm-sensors和Net-SNMP监控计算机硬件
- Net文章汇总帖
- ASP.NET MVC生命周期
- com.sun.xml.internal.ws.server.ServerRtException: Server Runtime Error: java.net.BindException: Cannot assign requested address: bind
- 《ASP.NET MVC 4 实战》----2.4 小结
- Asp.Net MVC学习总结之过滤器详解(转载)
- MongoDB操作(.net)
- 《U^2-Net:Going Deeper with Nested U-Structure for Salient Object Detection》论文笔记