【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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...