前几张基础架构已经搭建完了,我们在进行增删改查的时候,调用方法的实例就是用依赖注入模式做的,AutoFac的好处就是可以帮助我们对多个实例进行批量依赖注入:
下面就直接对多个实例利用AutoFac 进行批量注入:
新建一个AutofacModuleregister.cs 注册类:
using Autofac; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text; namespace Core.Net.Common.Core.Net.Data { public class AutofacModuleRegister : Autofac.Module { protected override void Load(ContainerBuilder builder) { var basePath = AppContext.BaseDirectory; #region 带有接口层的服务注入 var servicesDllFile = Path.Combine(basePath, "Core.Net.Services.dll"); var repositoryDllFile = Path.Combine(basePath, "Core.Net.Repository.dll"); if (!(File.Exists(servicesDllFile) && File.Exists(repositoryDllFile))) { var msg = "Repository.dll和Services.dll 丢失,因为项目解耦了,所以需要先F6编译,再F5运行,请检查 bin 文件夹,并拷贝。"; throw new Exception(msg); } // AOP 开关,如果想要打开指定的功能,只需要在 appsettigns.json 对应对应 true 就行。 //var cacheType = new List<Type>(); //if (AppSettingsConstVars.RedisConfigEnabled) //{ // builder.RegisterType<RedisCacheAop>(); // cacheType.Add(typeof(RedisCacheAop)); //} //else //{ // builder.RegisterType<MemoryCacheAop>(); // cacheType.Add(typeof(MemoryCacheAop)); //} // 获取 Service.dll 程序集服务,并注册 var assemblysServices = Assembly.LoadFrom(servicesDllFile); //支持属性注入依赖重复 builder.RegisterAssemblyTypes(assemblysServices).AsImplementedInterfaces().InstancePerDependency() .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies); // 获取 Repository.dll 程序集服务,并注册 var assemblysRepository = Assembly.LoadFrom(repositoryDllFile); //支持属性注入依赖重复 builder.RegisterAssemblyTypes(assemblysRepository).AsImplementedInterfaces().InstancePerDependency() .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies); // 获取 Service.dll 程序集服务,并注册 //var assemblysServices = Assembly.LoadFrom(servicesDllFile); //builder.RegisterAssemblyTypes(assemblysServices) // .AsImplementedInterfaces() // .InstancePerDependency() // .PropertiesAutowired() // .EnableInterfaceInterceptors()//引用Autofac.Extras.DynamicProxy; // .InterceptedBy(cacheType.ToArray());//允许将拦截器服务的列表分配给注册。 //// 获取 Repository.dll 程序集服务,并注册 //var assemblysRepository = Assembly.LoadFrom(repositoryDllFile); //builder.RegisterAssemblyTypes(assemblysRepository) // .AsImplementedInterfaces() // .PropertiesAutowired() // .InstancePerDependency(); #endregion } } }
在程序入口中添加一下内容:
using Autofac.Extensions.DependencyInjection; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace Core.Net.Web { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) //将默认ServiceProviderFactory指定为AutofacServiceProviderFactory .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); } }
在startup.cs 注册:
using Autofac; using Core.Net.Common.Core.Net.Core.Cookies; using Core.Net.Common.Core.Net.Core.Nlog4; using Core.Net.Common.Core.Net.Core.QuartZ.JobRun; using Core.Net.Common.Core.Net.Core.Redis; using Core.Net.Common.Core.Net.Data; using Core.Net.Common.Core.Net.Data.DBSql; using Core.Net.Web.Common.VerificationCode; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.IO; using System.Linq; namespace Core.Net.Web { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); //服务配置中加入AutoFac控制器替换规则。 services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>()); ////2、使用HttpContext需要注入 services.AddDistributedMemoryCache();//启用session之前必须先添加内存 // //services.AddSession(); services.AddSession(options => { options.Cookie.Name = ".AdventureWorks.Session"; options.IdleTimeout = TimeSpan.FromSeconds(2000);//设置session的过期时间 options.Cookie.HttpOnly = true;//设置在浏览器不能通过js获得该cookie的值 }); //配置authorrize services.AddAuthentication(b => { b.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; b.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; b.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; }).AddCookie(b => { //登陆地址 b.LoginPath = "/login"; //sid b.Cookie.Name = "My_SessionId"; // b.Cookie.Domain = "shenniu.core.com"; b.Cookie.Path = "/"; b.Cookie.HttpOnly = true; //b.Cookie.Expiration = new TimeSpan(0, 0, 30); b.ExpireTimeSpan = new TimeSpan(2, 0, 0); }); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); RedisClient.InitConnect(Configuration); //初始化redis services.AddSingleton<IQRCode,RaffQRCode>();//验证码注入 services.AddMvc().AddRazorRuntimeCompilation();//注入修改页面时候,保存可以直接刷新 } /// <summary> /// Autofac规则配置 /// </summary> /// <param name="builder"></param> public void ConfigureContainer(ContainerBuilder builder) { //获取所有控制器类型并使用属性注入 var controllerBaseType = typeof(ControllerBase); builder.RegisterAssemblyTypes(typeof(Program).Assembly) .Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType) .PropertiesAutowired(); builder.RegisterModule(new AutofacModuleRegister()); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. [Obsolete] public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHttpContextAccessor accessor, Microsoft.AspNetCore.Hosting.IApplicationLifetime lifetime, ILoggerFactory loggerFactory) { //注入当前HttpContext HttpContextHelper.Accessor = accessor; if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseSession(); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"UpFile")), RequestPath = new PathString("/UpFile"), ServeUnknownFileTypes = true //允许下载APK,用下面的方式必须把所有JSON都放进去 //ContentTypeProvider = new FileExtensionContentTypeProvider(new Dictionary<string, string>{ // { ".apk","application/vnd.android.package-archive"},{ ".nupkg","application/zip"} //}) }); app.UseCookiePolicy(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "MyArea", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute( name: "default", pattern: "{area=SystemManager}/{controller=Login}/{action=Index}/{id?}"); }); } } }
批量注入完毕。