回到目錄 對於IoC容器來說,性能最好的莫過於Autofac了,而對於靈活度來說,它也是值得稱贊的,為了考慮系統的性能,我們經常是在系統初始化於將所有依賴註冊到容器里,當需要於根據別名把實現拿出來,然後再使用即可;而如果每次使用都是註冊-反射,我相信那是很耗性能的,所以我們決定先依賴一次註冊,按需反 ...
對於IoC容器來說,性能最好的莫過於Autofac了,而對於靈活度來說,它也是值得稱贊的,為了考慮系統的性能,我們經常是在系統初始化於將所有依賴註冊到容器里,當需要於根據別名把實現拿出來,然後再使用即可;而如果每次使用都是註冊-反射,我相信那是很耗性能的,所以我們決定先依賴一次註冊,按需反射對象的實例!
通過Named全局註冊介面的所有實現
var builder = new ContainerBuilder(); builder.RegisterType<Mul1>() .Named<IMul>("Mul1") .InstancePerDependency(); builder.RegisterType<Mul2>() .Named<IMul>("Mul2") .InstancePerDependency();
通過ResolveNamed反射指定名稱的實現
IContainer container = builder.Build(); IMul mul = container.ResolveNamed<IMul>("Mul2");
一般地,我們可以通過資料庫或者XML文件來存儲實現與介面的對應關係,應用程式在啟動時讀取這種關係,統一完成註冊的過程
註冊的方法
var type = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes()) .Where(i => i.Name == "XXX_TaskInfoProvider").FirstOrDefault();
builder.RegisterType(type).Named<ITaskInfoProvider>("XXX_TaskInfoProvider").InstancePerDependency();
可插拔模塊-數據實體的設計
/// <summary> /// 可插拔模塊 /// </summary> class Module { /// <summary> /// 主鍵 /// </summary> public int ID { get; set; } /// <summary> /// 目前類型,完整路徑 /// </summary> public string ToTypeName { get; set; } /// <summary> /// 介面名稱,完整路徑 /// </summary> public string FromTypeName { get; set; } /// <summary> /// 描述 /// </summary> public string About { get; set; } }
這樣我們在程式的初口就可以統一註入動態的模塊了!
一般全局入口可以這樣設計
//模塊獲取 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();
這樣就通用了...