Autofac Container 的簡單的封裝重構

来源:http://www.cnblogs.com/niuww/archive/2016/07/07/5649632.html
-Advertisement-
Play Games

為了使用方便,對Autofac container的簡單封裝,記錄如下,備以後用或分享給大家,歡迎討論! 使用方法如下: ...


為了使用方便,對Autofac container的簡單封裝,記錄如下,備以後用或分享給大家,歡迎討論!

  1 using Autofac;
  2 using Autofac.Core.Lifetime;
  3 using Autofac.Integration.Mvc;
  4 
  5 public static class ContainerManager
  6     {
  7         private static IContainer _container;
  8 
  9         public static void SetContainer(IContainer container)
 10         {
 11             _container = container;
 12         }
 13 
 14         public static IContainer Container
 15         {
 16             get { return _container; }
 17         }
 18 
 19         public static T Resolve<T>(string key = "", ILifetimeScope scope = null) where T : class
 20         {
 21             if (scope == null)
 22             {
 23                 //no scope specified
 24                 scope = Scope();
 25             }
 26             if (string.IsNullOrEmpty(key))
 27             {
 28                 return scope.Resolve<T>();
 29             }
 30             return scope.ResolveKeyed<T>(key);
 31         }
 32 
 33         public static object Resolve(Type type, ILifetimeScope scope = null)
 34         {
 35             if (scope == null)
 36             {
 37                 //no scope specified
 38                 scope = Scope();
 39             }
 40             return scope.Resolve(type);
 41         }
 42 
 43         public static T[] ResolveAll<T>(string key = "", ILifetimeScope scope = null)
 44         {
 45             if (scope == null)
 46             {
 47                 //no scope specified
 48                 scope = Scope();
 49             }
 50             if (string.IsNullOrEmpty(key))
 51             {
 52                 return scope.Resolve<IEnumerable<T>>().ToArray();
 53             }
 54             return scope.ResolveKeyed<IEnumerable<T>>(key).ToArray();
 55         }
 56 
 57         public static T ResolveUnregistered<T>(ILifetimeScope scope = null) where T : class
 58         {
 59             return ResolveUnregistered(typeof(T), scope) as T;
 60         }
 61 
 62         public static object ResolveUnregistered(Type type, ILifetimeScope scope = null)
 63         {
 64             if (scope == null)
 65             {
 66                 //no scope specified
 67                 scope = Scope();
 68             }
 69             var constructors = type.GetConstructors();
 70             foreach (var constructor in constructors)
 71             {
 72                 try
 73                 {
 74                     var parameters = constructor.GetParameters();
 75                     var parameterInstances = new List<object>();
 76                     foreach (var parameter in parameters)
 77                     {
 78                         var service = Resolve(parameter.ParameterType, scope);
 79                         if (service == null) throw new ArgumentException("Unkown dependency");
 80                         parameterInstances.Add(service);
 81                     }
 82                     return Activator.CreateInstance(type, parameterInstances.ToArray());
 83                 }
 84                 catch (ArgumentException)
 85                 {
 86 
 87                 }
 88             }
 89             throw new ArgumentException("在所有的依賴項中,未找到合適的構造函數。");
 90         }
 91 
 92         public static bool TryResolve(Type serviceType, ILifetimeScope scope, out object instance)
 93         {
 94             if (scope == null)
 95             {
 96                 //no scope specified
 97                 scope = Scope();
 98             }
 99             return scope.TryResolve(serviceType, out instance);
100         }
101 
102         public static bool IsRegistered(Type serviceType, ILifetimeScope scope = null)
103         {
104             if (scope == null)
105             {
106                 //no scope specified
107                 scope = Scope();
108             }
109             return scope.IsRegistered(serviceType);
110         }
111 
112         public static object ResolveOptional(Type serviceType, ILifetimeScope scope = null)
113         {
114             if (scope == null)
115             {
116                 //no scope specified
117                 scope = Scope();
118             }
119             return scope.ResolveOptional(serviceType);
120         }
121 
122         public static ILifetimeScope Scope()
123         {
124             try
125             {
126                 if (HttpContext.Current != null)
127                     return AutofacDependencyResolver.Current.RequestLifetimeScope;
128 
129                 //when such lifetime scope is returned, you should be sure that it'll be disposed once used (e.g. in schedule tasks)
130                 return Container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag);
131             }
132             catch (Exception)
133             {
134                 //we can get an exception here if RequestLifetimeScope is already disposed
135                 //for example, requested in or after "Application_EndRequest" handler
136                 //but note that usually it should never happen
137 
138                 //when such lifetime scope is returned, you should be sure that it'll be disposed once used (e.g. in schedule tasks)
139                 return Container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag);
140             }
141         }
142     }

使用方法如下:

 1     /// <summary>
 2     /// IOCConfig
 3     /// </summary>
 4     public class IOCConfig
 5     {
 6         /// <summary>
 7         /// RegisterAll
 8         /// </summary>
 9         public static void RegisterAll()
10         {
11             var iocBuilder = new Autofac.ContainerBuilder();
12 
13             //todo:為了能編譯到web目錄,並且發佈方便,才在web項目中引用repository項目,在代碼中不要直接使用之
14             iocBuilder.RegisterModule<RIS.Infrastructure.RegisterModule>();
15             iocBuilder.RegisterModule<RIS.Biz.RegisterModule>();
16             iocBuilder.RegisterModule<RIS.Repository.RegisterModule>();
17 
18             iocBuilder.Register((c, p) => new WebWorkContext(p.Named<string>("userToken")))
19                 .As<RIS.Biz.Core.IWorkContext>()
20                 .InstancePerLifetimeScope();
21 
22 
23             iocBuilder.RegisterControllers(Assembly.GetExecutingAssembly());
24 
25             iocBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
26 
27             //iocBuilder.RegisterModelBinders(Assembly.GetExecutingAssembly());
28             //iocBuilder.RegisterModelBinderProvider();
29             //iocBuilder.RegisterModule<AutofacWebTypesModule>();
30             var config = GlobalConfiguration.Configuration;
31             iocBuilder.RegisterWebApiFilterProvider(config);
32             IContainer iocContainer = iocBuilder.Build();
33             config.DependencyResolver = new AutofacWebApiDependencyResolver(iocContainer);
34             System.Web.Mvc.DependencyResolver.SetResolver(new AutofacDependencyResolver(iocContainer));
35 
36 
37             RIS.Biz.Core.ContainerManager.SetContainer(iocContainer);
38         }
39     }
40     
41     // 註意: 有關啟用 IIS6 或 IIS7 經典模式的說明,
42     // 請訪問 http://go.microsoft.com/?LinkId=9394801
43     /// <summary>
44     /// MvcApplication
45     /// </summary>
46     public class MvcApplication : System.Web.HttpApplication
47     {
48         /// <summary>
49         /// 程式啟動入口
50         /// </summary>
51         protected void Application_Start()
52         {
53             IOCConfig.RegisterAll();
54 
55             AreaRegistration.RegisterAllAreas();
56 
57             WebApiConfig.Register(GlobalConfiguration.Configuration);
58             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
59             RouteConfig.RegisterRoutes(RouteTable.Routes);
60             BundleConfig.RegisterBundles(BundleTable.Bundles);
61         }
62     }

 


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

-Advertisement-
Play Games
更多相關文章
  • log4Net作為專業的log記錄控制項,對於它的強大功能大家一定不陌生。下麵我將詳細介紹如何利用其自定義屬性,讓日誌信息更完整。一,創建測試工程,log4Net組件可以自己從網上下載,也可通過Nuget進行安裝。 二,創建日誌模型及資料庫表,因為我們的日誌信息可以輸出為文本,也可以輸出到資料庫。三, ...
  • 工作上遇到的問題,網上找了一些資料 整理了一個比較可行的解決方案。 NPOI 大數據量分多個sheet導出 代碼段 /// <summary> /// DataTable轉換成Excel文檔流,並輸出到客戶端 /// </summary> /// <param name="table"></para ...
  • 1.1 功能介紹 使用ibatis.net ORM框架時,有時候需要操作多個資料庫,同時有時候也需要對連接資料庫信息進行加密,本文通過將配置連接寫到Web.config中, 這樣就可以在Web.config中加密,在讀取的地方再解密使用。 下麵是具體的配置方法,有更好方法的也歡迎指出, 對於ibat ...
  • 前臺: var username = $("#UserName").val(); var tel = $("#tel").val(); var yzm = $("#yzm").val(); var con = $("#con").val(); layer.msg('正在提交數據', { icon: ...
  • 標簽: WebSocket SignalR "前言" "1. Web消息交互技術" "1.1 常見技術" "1.2 WebSocket介紹" "1.3 WebSocket示例" "2. Signal" "2.1 SignalR是什麼" "2.2 預設傳輸方式" "2.3 指定傳輸方式" "2.4 自 ...
  • 通常,我們會對於一個文本文件數據導入到資料庫中,不多說,上代碼。 首先,表結構如下. 其次,在我當前D盤中有個文本文件名為2.txt的文件。 在資料庫中,可以這樣通過一句代碼插入。 1) bulk insert: 為Sql server 中一個批量插入的操作 2)T_Demo: 要插入的表 3)'D ...
  • 在C# 6.0,當我們使用Dictionary時,我們可以使用新語法,來去簡化程式以提高效率。 public Dictionary<string, object> OldToolLocations = new Dictionary<string, object>() { {"ToolLocation ...
  • Extjs Mvc模式下的整個MVC框架體系即下圖: 包含了Controller(實現方法層),Store(數據來源管理層),View(頁面佈局層)。之所以用MVC我想是因為減輕針對某一頁面的單一的JS 的開發,為啥呢,可以看一下沒有使用MVC模式的Extjs 的編碼: (因為我也是新手,所以可能里 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...