週末加班,下午犯困,整理下以前鼓搗過的東西,看過我以前的webapi系列的讀者知道,我以前試過Aspect,可是升級到3.0以後沒往下去試了,當時還留了個坑,這不,如今果斷移除了換成這個了。git
這個第三方類庫呢,是Ioc的容器,能夠簡化咱們很大的工做量,好比說在以前咱們須要寫個類去聲明接口與實現,而用了這個容器呢,就不須要了,固然仍是須要些配置的。github
首先,引入第三方類庫,很少說。web
而後開始配置吧,首先先來看Program,添加AutofacServiceProviderFactory。後端
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .UseServiceProviderFactory(new AutofacServiceProviderFactory());
改完以後呢,咱們果斷就來到了Startup,只要是配置,固然要看入口文件跟這個配置文件了。api
3.x呢有個變化就是Autofac要經過ConfigureContainer這個傳入容器的方法來配置了,不須要本身再建立。app
private static readonly List<string> _Assemblies = new List<string>() { "April.Service" }; public void ConfigureContainer(ContainerBuilder container) { var assemblys = _Assemblies.Select(x => Assembly.Load(x)).ToList(); List<Type> allTypes = new List<Type>(); assemblys.ForEach(aAssembly => { allTypes.AddRange(aAssembly.GetTypes()); }); // 經過Autofac自動完成依賴注入 container.RegisterTypes(allTypes.ToArray()) .AsImplementedInterfaces() .PropertiesAutowired() .InstancePerDependency(); // 註冊Controller container.RegisterAssemblyTypes(typeof(Startup).GetTypeInfo().Assembly) .Where(t => typeof(Controller).IsAssignableFrom(t) && t.Name.EndsWith("Controller", StringComparison.Ordinal)) .PropertiesAutowired(); }
經過RegisterTypes的註冊方法將對應工程,也就是April.Service下的類接口與實現自動綁定,固然你也能夠經過註冊接口的方法一個個來,可是我懶,好比:ide
// 一個 builder.RegisterType<StudentService>().As<IStudentService>(); // 一對多 builder.RegisterType<StudentService>().As<IStudentService>().As<ITestService>();
這裏注意,聲明綁定通常是一對一,固然也能夠是一對多,若是屢次註冊聲明一個類,會取最後一次註冊的聲明做爲實際操做的類。函數
好了,配置完成以後,咱們來試下效果吧(固然我是已經註釋掉以前的ServiceInjection這個聲明方法了)。測試
在咱們訪問Values的時候,咱們看下IStudentService是不是null。
OK,這已經說明經過Autofac這個容器,已經完成了一個工程裏面的接口與實現的依賴關係了。
在接觸的朋友中,有人給我反饋個信息,我不想每次寫方法都要構造函數來傳接口方法給我,也就是說我不要你以爲,我要我以爲。
好啊,你以爲方法本身要啥拿啥,能夠,來個Util吧。
public class AutofacUtil { public static ILifetimeScope Container { get; set; } /// <summary> /// 獲取服務(Single) /// </summary> /// <typeparam name="T">接口類型</typeparam> /// <returns></returns> public static T GetService<T>() where T : class { return Container.Resolve<T>(); } /// <summary> /// 獲取服務(請求生命週期內) /// </summary> /// <typeparam name="T">接口類型</typeparam> /// <returns></returns> public static T GetScopeService<T>() where T : class { return (T)GetService<IHttpContextAccessor>().HttpContext.RequestServices.GetService(typeof(T)); } }
在用以前,咱們須要針對Container來個聲明實例化,Startup中的Configure添加下面一句。
AutofacUtil.Container = app.ApplicationServices.GetAutofacRoot();
修改Values中的一部分來經過實例化的方式來調用接口。
IStudentService studentService = AutofacUtil.GetScopeService<IStudentService>(); StudentEntity entity = new StudentEntity { //新增 Name = "小明", Age = 18, Number = "007", Sex = 0, Address = "大洛陽" }; studentService.Insert(entity);
讓咱們來看下效果吧。
兩種方法,看我的習慣吧,我是推薦經過注入的方式,經過構造函數的方式來獲取接口實現。
簡單記錄平時鼓搗的點點滴滴,有時候真是以爲,仍是要多看多鼓搗,就像這個容器,在以前我經過一行一行的接口+實現來作綁定聲明,如今呢,只須要改造下,就能夠一鍵無腦實例化,第三方庫的使用與否,我的以爲仍是能踩着巨人的肩膀哪怕靠着也能夠,本身一步步爬當然可嘉,也要學會變通,這樣方能提升效率,路漫漫其修遠兮。
April-Admin,總算是要有個先後端聯動的工程了,一個名副其實的基礎工程。
前端基於Ant Design Pro
後端固然是net core 3.1了