【Unity】微軟的一款依賴註入組件

来源:https://www.cnblogs.com/yanbigfeg/archive/2018/10/28/9871194.html
-Advertisement-
Play Games

前言 前面學習了autofac這個依賴註入組件,本來是打算寫在一起的,因為這個組件沒打算像autofac一樣詳細的寫,只是寫下以前自己鼓搗玩搭建框架然後使用的一個依賴註入組件,並且也是進行了封裝使用。不打算作為學習知識,僅作為使用封裝記錄的。 沒想autofac寫著寫著篇幅有點長,就單獨當作一個封裝 ...


前言

前面學習了autofac這個依賴註入組件,本來是打算寫在一起的,因為這個組件沒打算像autofac一樣詳細的寫,只是寫下以前自己鼓搗玩搭建框架然後使用的一個依賴註入組件,並且也是進行了封裝使用。不打算作為學習知識,僅作為使用封裝記錄的。

沒想autofac寫著寫著篇幅有點長,就單獨當作一個封裝類記錄一下吧。技術就和東西差不多長時間不使用就容易忘記。

上一篇autofac地址:【AutoFac】依賴註入和控制反轉的使用

Unity

 引用dll

別的不說引用還是要簡單說一下的,在使用前要引用dll:

類文件結構

我這裡是把Unity組件和項目業務進行了分層所有我這個組件相當於在一個獨立的項目中,單獨的封裝到了IOC文件夾下創建,這裡不介紹整個解決方案了只對這個介紹下,大致的結構如下:

IOC封裝類

這個是主要類,容器的註入和獲取容器裡面的類相當於Unity的入口調用和請求都通過他,這個封裝有一個好處就是統一調用(廢話)。

 /// <summary>
    /// 依賴註入之區域註入方式
    /// 沒有寫入到配置文件可傳參註入
    /// </summary>
    public class Ioc
    {
        private static readonly UnityContainer _container;

        static Ioc()
        {
            _container = new UnityContainer();
        }

        public static void RegisterInheritedTypes(Assembly assembly, Type baseType)
        {
            _container.RegisterInheritedTypes(assembly, baseType);
        }

        public static void Register<TInterface, TImplementation>() where TImplementation : TInterface
        {
            _container.RegisterType<TInterface, TImplementation>();
        }

        public static T Get<T>()
        {
            return _container.Resolve<T>();
        }
    }

Unity擴展註冊

然後有一個Unity擴展註冊方法:

 

 public static class UnityContainerExtensions
    {
        /// <summary>
        /// Unity擴展註冊方法
        /// </summary>
        /// <param name="container"></param>
        /// <param name="assembly"></param>
        /// <param name="baseType"></param>
        public static void RegisterInheritedTypes(this IUnityContainer container, Assembly assembly, Type baseType)
        {
            var allTypes = assembly.GetTypes();
            var baseInterfaces = baseType.GetInterfaces();
            foreach (var type in allTypes)
            {
                if (type.BaseType != null && type.BaseType.GenericEq(baseType))
                {
                    var typeInterface = type.GetInterfaces().FirstOrDefault(x => !baseInterfaces.Any(bi => bi.GenericEq(x)));
                    if (typeInterface == null)
                    {
                        continue;
                    }
                    container.RegisterType(typeInterface, type);
                }
            }
        }
    }

這個很關鍵哦,這裡再說下我這裡其實不是每個類都要寫一遍註冊,而是所有業務類繼承於一個底層抽象類ServiceBase。然後傳入程式集和類型,就會把當前程式集下的所有這個類型註冊進去。

例如我有UserServer和UserServerTwo兩個業務類,我讓他都繼承ServiceBase抽象類,當然他們仍然要實現自己的服務介面的就拿UserServer舉例吧:

這樣我到時候使用只需要註冊一遍就把這兩個服務同時註入了。什麼好處在哪裡,第一註冊代碼寫少了,第二實現區域化分類。

 註冊使用

使用根據mvc的控制器區域進行單獨註冊即可:

 public override void RegisterArea(AreaRegistrationContext context) 
        {
            //註冊使用代碼,先註冊後使用
            Ioc.RegisterInheritedTypes(typeof(Server_Areas.Admin.IUserServer).Assembly, typeof(ServiceBase));
            context.MapRoute(
                "AdminAreas_default",
                "AdminAreas/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional },
                   new string[] { "LayerFrame.Areas." + this.AreaName + ".Controllers" }
            );
        }

然後在該區域控制器使用:

        public ActionResult Index()
        {
            //測試日誌
            LogHelp.WriteFile("deBug", "這是日誌輸出哦");


            //數據操作
            var service = Ioc.Get<Server_Areas.Admin.IUserServer>();
            //添加數據
            UserInfor user = new UserInfor();
            user.userAccount = "test001";
            user.userPwd = "123456";
            user.userPhone = "0530123456";
            user.userRealName = "真實姓名";
            user.userSex = 0;
            user.userPhone = "0530123456";
            user.userRemark = "備註內容";
            user.addTime = DateTime.Now;
            int count = service.UserAdd(user);
            var data= service.GetData();
            ViewBag.data = service.GetData();
            return View();
        }

Unity配置文件註入:

每次註入服務類是很麻煩的,比如修改了增加了,總不能一直去修改代碼吧,總是不好的,所以我們也可以寫到配置文件統一管理,比較方便(其實我上面封裝的也很方便了)。這個比上面好的是在於不用進行區域註冊了。全部統一註冊了。

UnityFactory類:

這裡我又一個地方是使用了以前的一篇【Config】類庫讀取自己的配置文件,配置文件的擴展,所以我是單獨在IOC文件夾下創建了對應的web.config文件,如果寫在項目跟web.config文件把註釋那句話取消即可。

 public class UnityFactory
    {
        private static IUnityContainer _iUnityContainer = null;
        private UnityFactory()
        {

        }
        static UnityFactory()
        {
            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
           string basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "IOC\\Unity.Config");
            Configuration configuration = LibConfig.InitConfig("IOC\\Unity");
             UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
           // UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName);
            _iUnityContainer = new UnityContainer();
            try
            {
                section.Configure(_iUnityContainer, "MyContainer");
            }
            catch (Exception e)
            {

                throw;
            }
        }

        public static IUnityContainer GetContainerInstance()
        {
            return _iUnityContainer;
        }

        public static T GetServer<T>()
        {
            try
            {
                return _iUnityContainer.Resolve<T>();
            }
            catch (Exception e)
            {

                throw;
            }
        }
    }

使用就特別簡單啦:

        public ActionResult Test() {
            try
            {
                var service = UnityFactory.GetServer<Server_Areas.Admin.UserServer>();
                var data = service.GetData();
            }
            catch (Exception e)
            {
            }
            return View();
        }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在創建多個控制項後,有些控制項會發生重疊,那麼就需要在滑鼠按下它時能顯示在最上層,下麵通過先將按下操作的控制項刪除然後再重建,就達到讓它顯示在最上層了 ...
  • 1)避免使用ArrayList。 因為任何對象添加到ArrayList都要封箱為System.Object類型,從ArrayList取出數據時,要拆箱回實際的類型。建議使用自定義的集合類型代替ArrayList。.net 2.0提供了一個新的類型,叫泛型,這是一個強類型,使用泛型集合就可以避免了封箱 ...
  • 好久沒有更新文章了,前段時間寫了一系列的文章放到桌面了,想著修修改改,後來系統中勒索病毒了還被公司網路安全的抓到是我電腦,後來裝系統文章給裝丟了。然後好長一段時間沒有寫了。 今天記錄一下AspNetCore 部署Docker+Centos 7 這裡說明一下:Docker 需要用Centos7版本的操 ...
  • 考慮到很多面試可能會考察冒泡排序的用法,所以特地花時間釐清了一下思路。下麵說一下我的思路:冒泡排序核心就是比較方法,冒泡排序的比較方法顧名思義就是像氣泡一樣,最大(或者最小)的數往上冒。普通比較幾個數,我們可以用if(a>b)然後c=a;b=a 。。。。這類方法,把大數暫存到c中,然後小的數存到原本 ...
  • 開機啟動程式,在很多場合都會用到,尤其是那種在後臺運行的程式。 效果圖: 以上兩幅圖都用到了命令行啟動程式,為了模擬開機啟動或者其他程式調用此程式。 第一幅圖:程式啟動可以根據不同參數,執行不同的操作。如果是雙擊啟動,就自動運行邏輯代碼,如果是帶特定參數啟動,就自動運行邏輯代碼。 第二幅圖:winf ...
  • 好久沒寫博客了,就寫一個小東西 var sBufferDist = document.getElementById('txtBufferDist').value; var sBufferBlank = sBufferDist.replace(/\ +/g, "");//將空格變成空,其中CS中的Tr ...
  • (轉自網易AlexChen) 1.配置文件鏈接。 利用VS.NET開發平臺進行開發的時候將會經常遇到要和資料庫打交道,存取數據。這就涉及到和資料庫的連接問題,.NET開發平臺為我們提供了一種簡單的方式來定義和資料庫連接的字元串。這就是在Web.Config文件中添加連接字元串。由於在開發中多次遇到這 ...
  • 瞭解MVC開發模式,首先我們要瞭解一下發展趨勢 一、什麼是軟體設計 Jack W.Reeves 於14年前(1992年),就在其撰寫的論文——《What is Software Design》中給出了其個人觀點——“代碼源就是設計”。 類比:建築設計行業中,建築設計圖的最終完成標識了設計過程的終結, ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...