|
周末加班,下午犯困,整理下之前鼓搗過的東西,看過我之前的webapi系列的讀者知道,我之前試過Aspect,但是升級(jí)到3.0之后沒往下去試了,當(dāng)時(shí)還留了個(gè)坑,這不,現(xiàn)在果斷移除了換成這個(gè)了。 Autofac這個(gè)第三方類庫呢,是Ioc的容器,可以簡化我們很大的工作量,比如說在之前我們需要寫個(gè)類去聲明接口與實(shí)現(xiàn),而用了這個(gè)容器呢,就不需要了,當(dāng)然還是需要些配置的。 首先,引入第三方類庫,不多說。
然后開始配置吧,首先先來看Program,添加AutofacServiceProviderFactory。 public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseServiceProviderFactory(new AutofacServiceProviderFactory());改完之后呢,我們果斷就來到了Startup,只要是配置,當(dāng)然要看入口文件跟這個(gè)配置文件了。 3.x呢有個(gè)變化就是Autofac要通過ConfigureContainer這個(gè)傳入容器的方法來配置了,不需要自己再創(chuàng)建。 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自動(dòng)完成依賴注入
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的注冊方法將對應(yīng)工程,也就是April.Service下的類接口與實(shí)現(xiàn)自動(dòng)綁定,當(dāng)然你也可以通過注冊接口的方法一個(gè)個(gè)來,但是我懶,比如: // 一個(gè) builder.RegisterType<StudentService>().As<IStudentService>(); // 一對多 builder.RegisterType<StudentService>().As<IStudentService>().As<ITestService>();
好了,配置完成之后,我們來試下效果吧(當(dāng)然我是已經(jīng)注釋掉之前的ServiceInjection這個(gè)聲明方法了)。 在我們訪問Values的時(shí)候,我們看下IStudentService是否是null。 OK,這已經(jīng)說明通過Autofac這個(gè)容器,已經(jīng)完成了一個(gè)工程里面的接口與實(shí)現(xiàn)的依賴關(guān)系了。 添加一個(gè)Util來隨時(shí)調(diào)用在接觸的朋友中,有人給我反饋個(gè)信息,我不想每次寫方法都要構(gòu)造函數(shù)來傳接口方法給我,也就是說我不要你覺得,我要我覺得。 好啊,你覺得方法自己要啥拿啥,可以,來個(gè)Util吧。 public class AutofacUtil
{
public static ILifetimeScope Container { get; set; }
/// <summary>
/// 獲取服務(wù)(Single)
/// </summary>
/// <typeparam name="T">接口類型</typeparam>
/// <returns></returns>
public static T GetService<T>() where T : class
{
return Container.Resolve<T>();
}
/// <summary>
/// 獲取服務(wù)(請求生命周期內(nèi))
/// </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來個(gè)聲明實(shí)例化,Startup中的Configure添加下面一句。 AutofacUtil.Container = app.ApplicationServices.GetAutofacRoot(); 修改Values中的一部分來通過實(shí)例化的方式來調(diào)用接口。 IStudentService studentService = AutofacUtil.GetScopeService<IStudentService>();
StudentEntity entity = new StudentEntity
{
//新增
Name = "小明",
Age = 18,
Number = "007",
Sex = 0,
Address = "大洛陽"
};
studentService.Insert(entity);讓我們來看下效果吧。 兩種方法,看個(gè)人習(xí)慣吧,我是推薦通過注入的方式,通過構(gòu)造函數(shù)的方式來獲取接口實(shí)現(xiàn)。 小結(jié)簡單記錄平時(shí)鼓搗的點(diǎn)點(diǎn)滴滴,有時(shí)候真是覺得,還是要多看多鼓搗,就像這個(gè)容器,在之前我通過一行一行的接口+實(shí)現(xiàn)來做綁定聲明,現(xiàn)在呢,只需要改造下,就可以一鍵無腦實(shí)例化,第三方庫的使用與否,個(gè)人覺得還是能踩著巨人的肩膀哪怕靠著也可以,自己一步步爬固然可嘉,也要學(xué)會(huì)變通,這樣方能提高效率,路漫漫其修遠(yuǎn)兮。 代碼地址預(yù)告April-Admin,總算是要有個(gè)前后端聯(lián)動(dòng)的工程了,一個(gè)名副其實(shí)的基礎(chǔ)工程。 前端基于Ant Design Pro |
|
|