日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第七节:WebApi与Unity整合进行依赖注入和AOP的实现

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第七节:WebApi与Unity整合进行依赖注入和AOP的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. IOC和DI

1. 通過Nuget引入Unity程序集。

? ??PS:【版本:5.8.6】

2. 新建DIFactory類,用來讀取Unity的配置文件并創建Unity容器,需要注意的是DIFactory類需要聲明成單例。

PS:這里采用靜態構造函數(必須是無參的)的形式來實現單例,MVC框架的那個框架采用的是 雙if+lock鎖的形式實現的單例,結果都一樣。

代碼分享:

1 /// <summary>2 /// 依賴注入工廠(單例的 采用靜態構造函數)3 /// 讀取Unity的配置文件,并創建Unity容器4 /// 需要引入程序集“System.Configuration”5 /// </summary>6 public class DIFactory7 {8 private static IUnityContainer _Container = null;9 static DIFactory() 10 { 11 //1. 固定的4行代碼讀取配置文件 12 ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 13 fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\UnityConfig.xml");//找配置文件的路徑 14 Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 15 UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName); 16 //2. Unity層次的步驟 17 _Container = new UnityContainer(); 18 //加載節點的名稱為"apiContainer" 19 section.Configure(_Container, "apiContainer"); 20 } 21 22 /// <summary> 23 /// 對外開放函數,用來獲取Unity容器 24 /// </summary> 25 /// <returns></returns> 26 public static IUnityContainer GetContainer() 27 { 28 return _Container; 29 } 30 }

3. 新建UnityDependencyResolver類,用來自定義控制器實例化工廠.

特別注意:該類這里實現的是IDependencyResolver接口,來自WebApi下的程序集,而非MVC,所以和MVC下的寫法有區別.

代碼分享:

1 public class UnityDependencyResolver : IDependencyResolver2 {3 private IUnityContainer _IUnityContainer = null;4 public UnityDependencyResolver(IUnityContainer unityContainer)5 {6 this._IUnityContainer = unityContainer;7 }8 9 /// <summary> 10 /// 獲取單個服務 11 /// </summary> 12 /// <param name="serviceType"></param> 13 /// <returns></returns> 14 public object GetService(Type serviceType) 15 { 16 try 17 { 18 return this._IUnityContainer.Resolve(serviceType); 19 } 20 catch (ResolutionFailedException ex)//因為會累計構造多個對象,很多是沒有去擴展,直接null就行 21 { 22 return null; 23 } 24 } 25 26 public IEnumerable<object> GetServices(Type serviceType) 27 { 28 try 29 { 30 return this._IUnityContainer.ResolveAll(serviceType); 31 } 32 catch (ResolutionFailedException) 33 { 34 return new List<object>(); 35 } 36 } 37 38 public IDependencyScope BeginScope()//每次請求 39 { 40 var child = this._IUnityContainer.CreateChildContainer(); 41 return new UnityDependencyResolver(child); 42 } 43 44 public void Dispose() 45 { 46 this._IUnityContainer.Dispose(); 47 } 48 }

4. 新建CfgFiles文件夾和UnityConfig.xml文件,該xml文件需要改屬性為“始終復制”。

代碼分享:

<configuration><configSections><section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/></configSections><unity><!-- unity容器配置注冊節點--><containers><container name="apiContainer"><!-- type中的兩個參數分別是:類型名稱和DLL程序集的名稱 --><!-- mapTo中的兩個參數分別是:類型名稱和DLL程序集的名稱 --><!--分析:這里我們需要使用的是TestService,但不直接使用它,而是使用它的接口,即將【mapTo】里的類型注冊給【type】里的類型--><register type="WebApiBasic.Interface.ITestService,01-WebApiBasic" mapTo="WebApiBasic.Service.TestService,01-WebApiBasic"/><register type="WebApiBasic.Interface.ITestService2,01-WebApiBasic" mapTo="WebApiBasic.Service.TestService2,01-WebApiBasic"/></container></containers></unity> </configuration>

5. 在WebApiConfig文件中進行配置,把webapi的DependencyResolver換成自己的Unity版本的

config.DependencyResolver = new UnityDependencyResolver(DIFactory.GetContainer());

6. 新建Service文件夾和Interface文件夾,分別創建TestService類和ITestService接口,并去UnityConfig.xml文件中進行注冊(上述xml里已經注冊好了)。

代碼如下:

1 public class TestService : ITestService 2 { 3 public string GetInfor() 4 { 5 return "我是ypf"; 6 } 7 }

1 public interface ITestService 2 { 3 string GetInfor(); 4 }

7. 在控制器中進行構造函數的注入,注入TestService對象。

public class EighthController : ApiController{private ITestService _ITestService = null;public EighthController(ITestService testService){this._ITestService = testService;}[HttpGet]public string GetInfor(){var result = _ITestService.GetInfor();return result;}}

?

8. 利用PostMan進行測試 http://localhost:2131/api/Eighth/GetInfor, 測試成功。

?

?

二. AOP

1. 通過Nuget引入Unity.Interception程序集,同時會自動把它依賴的Unity.Abstractions程序集引入。

PS:【版本:5.5.3】

2. 新增TestService2類和ITestService2接口,用來測試AOP。

代碼如下:

1 public interface ITestService22 {3 string GetInfor2();4 }5 public class TestService2 : ITestService26 {7 public string GetInfor2()8 {9 return "我是ypf2"; 10 } 11 }

3. 新建AOP文件夾,并新建LogBeforeBehavior類,實現IInterceptionBehavior接口,在Invoke中寫AOP相關的代碼。

1 /// <summary>2 /// Unity為我們提供了一個IInterceptionBehavior接口需要實現這個接口3 /// 接口為我們提供了三個方式(GetRequiredInterfaces、Invoke、WillExecute)實現4 /// WillExecute表示是否執行該行為,如果是false這個方法被調用時,不會被捕捉。因為我們總是要執行的,所以為true5 /// GetRequiredInterfaces將你想要的接口類型和行為聯系起來,我們暫時不需要,所以返回Type.EmptyTypes6 /// Invoke執行方式接口,我們主要使用它7 /// </summary>8 public class LogBeforeBehavior : IInterceptionBehavior9 { 10 public bool WillExecute 11 { 12 get { return true; } 13 } 14 15 public IEnumerable<Type> GetRequiredInterfaces() 16 { 17 return Type.EmptyTypes; 18 } 19 20 public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 21 { 22 Console.WriteLine("我是方法執行前執行的業務"); 23 24 //下面這句話表示這里執行方法 25 var result = getNext()(input, getNext); 26 return result; 27 } 28 }

4. 在UnityConifig.xml文件中配置AOP相關的代碼,并且給TestService2注入的代碼配置AOP相關的LogAopBehavior類。

代碼分享:

1 <configuration>2 <configSections>3 <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>4 </configSections>5 <unity>6 <!--Unity的AOP的相關配置-->7 <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>8 <!-- unity容器配置注冊節點-->9 <containers> 10 <container name="apiContainer"> 11 <!--Unity的AOP的相關配置--> 12 <extension type="Interception"/> 13 <!-- type中的兩個參數分別是:類型名稱和DLL程序集的名稱 --> 14 <!-- mapTo中的兩個參數分別是:類型名稱和DLL程序集的名稱 --> 15 <!-- 16 分析:這里我們需要使用的是TestService,但不直接使用它,而是使用它的接口,即將【mapTo】里的類型注冊給【type】里的類型 17 --> 18 <register type="WebApiBasic.Interface.ITestService,01-WebApiBasic" mapTo="WebApiBasic.Service.TestService,01-WebApiBasic"/> 19 <register type="WebApiBasic.Interface.ITestService2,01-WebApiBasic" mapTo="WebApiBasic.Service.TestService2,01-WebApiBasic"> 20 <interceptor type="InterfaceInterceptor"/> 21 <interceptionBehavior type="WebApiBasic.AOP.LogBeforeBehavior,01-WebApiBasic"/> 22 </register> 23 </container> 24 </containers> 25 </unity> 26 </configuration>

?

5. 用PostMan進行測試 http://localhost:2131/api/Eighth/GetInfor2 ,通過加斷點,發現:執行方法前,先進入了LogBeforeBehavior類中進行執行了。

總結

以上是生活随笔為你收集整理的第七节:WebApi与Unity整合进行依赖注入和AOP的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。