文章出處

回到目錄

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

這樣就通用了...

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()