IoC組件~Autofac將多實現一次注入,根據別名Resove實例


回到目錄

對於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();

這樣就通用了...

回到目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM