IoC組件~Autofac將多實現一次(ci)注(zhu)入,根據別(bie)名Resove實例
對(dui)于(yu)IoC容器來說,性(xing)能最好的莫過于(yu)Autofac了(le),而對(dui)于(yu)靈活度來說,它也是值得稱贊的,為(wei)了(le)考慮系統的性(xing)能,我們經常是在系統初始化于(yu)將(jiang)所有(you)依賴注(zhu)冊到(dao)容器里(li),當需(xu)(xu)要于(yu)根據別名把實現拿出來,然后再使用即可;而如果每次使用都是注(zhu)冊-反射,我相信(xin)那(nei)是很耗性(xing)能的,所以(yi)我們決定(ding)先依賴一(yi)次注(zhu)冊,按需(xu)(xu)反射對(dui)象的實例!
通過(guo)Named全局注冊(ce)接口的所(suo)有實現
var builder = new ContainerBuilder(); builder.RegisterType<Mul1>() .Named<IMul>("Mul1") .InstancePerDependency(); builder.RegisterType<Mul2>() .Named<IMul>("Mul2") .InstancePerDependency();
通過ResolveNamed反射(she)指定名稱的實(shi)現
IContainer container = builder.Build(); IMul mul = container.ResolveNamed<IMul>("Mul2");
一般地,我們可以通過數據庫或者XML文件來(lai)存儲實現與接口的對應關(guan)系,應用程序(xu)在啟(qi)動(dong)時讀取這種關(guan)系,統一完成注冊的過程
注冊(ce)的方法
var type = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes()) .Where(i => i.Name == "XXX_TaskInfoProvider").FirstOrDefault();
builder.RegisterType(type).Named<ITaskInfoProvider>("XXX_TaskInfoProvider").InstancePerDependency();
可(ke)插拔模(mo)塊-數據實體的設(she)計
/// <summary> /// 可插(cha)拔模(mo)塊 /// </summary> class Module { /// <summary> /// 主鍵 /// </summary> public int ID { get; set; } /// <summary> /// 目前類型(xing),完整路徑(jing) /// </summary> public string ToTypeName { get; set; } /// <summary> /// 接口名稱,完整路徑 /// </summary> public string FromTypeName { get; set; } /// <summary> /// 描述 /// </summary> public string About { get; set; } }
這樣我們在(zai)程序(xu)的初口就可(ke)以(yi)統(tong)一注入動(dong)態(tai)的模塊了!
一般全局(ju)入口可以(yi)這樣設計(ji)
//模塊獲取 ModuleList = new List<Modules>(); ModuleList.Add(new Modules { ID = 1, FromTypeName = "Progame.IMul", ToTypeName = "Progame.Mul1" }); ModuleList.Add(new Modules { ID = 1, FromTypeName = "Progame.IMul", ToTypeName = "Program.Mul2" }); //統一注冊 var builder = new ContainerBuilder(); foreach (var item in ModuleList) { var fromType = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes()) .Where(i => i.FullName == item.FromTypeName).FirstOrDefault(); var toType = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes()) .Where(i => i.FullName == item.ToTypeName).FirstOrDefault(); builder.RegisterType(toType).Named(toType.FullName, fromType).InstancePerDependency(); } container = builder.Build();
這樣就通用了...