轉發請註明出處:https://home.cnblogs.com/u/zhiyong-ITNote/ 整個Demo是基於Controller-Service-Repository架構設計的,每一層之間是通過介面來實現解耦與調用的,參照了《ASP.NETMVC5框架揭秘》一書最後的網站示例架構,使用U ...
轉發請註明出處:https://home.cnblogs.com/u/zhiyong-ITNote/
整個Demo是基於Controller-Service-Repository架構設計的,每一層之間是通過介面來實現解耦與調用的,參照了《ASP.NETMVC5框架揭秘》一書最後的網站示例架構,使用Unity容器作為DI容器以及實現AOP。
首先Repository文件夾裡面的代碼文件:
見百度網盤鏈接
整個Repository相當於三層架構裡面的DAL數據訪問層,它的作用就是調用資料庫,封裝了最基本的增刪改查,當然你可以選擇ADO.NET或是EntityFramework來做資料庫驅動。
其次就是Services文件夾裡面的代碼文件:
見百度網盤鏈接
整個Services文件主要的功能就是調用下一層的Repository文件夾的相關類。我們在這裡就是使用DI中的構造函數註入了,使用介面來實現解耦,這就需要用到unity容器了。這個層次是為上一層的控制器層服務的。
接下來就是Controller層了,這一層調用下一層Services也是基於介面,使用DI構造函數註入實現瞭解耦。
見百度網盤鏈接
準備做好了,接下來就是使用Unity容器來替換MVC框架預設的控制器工廠以及基於Unity的AOP設計。
首先基於DefaultControllerFactory創建一個UnityControllerFactory,引入unity容器:
public class UnityControllerFactory : DefaultControllerFactory { public IUnityContainer UnityContainer { get; private set; } public UnityControllerFactory() { /// unity container 的AOP可以完成IOC的功能,在我們使用AOP的時候 /// 也就完成了依賴項的實例化。 UnityContainer = new UnityContainer(); UnityContainer.AddNewExtension<Interception>() .RegisterType<IFooRepository, FooRepository>() ///IOC註入實現 .RegisterType<IBarRepository, BarRepository>() ///IOC註入實現 .RegisterType<IFooService, FooService>() /// FooService的AOP .Configure<Interception>() .SetInterceptorFor<IFooService>(new InterfaceInterceptor()); /// BarSerice的AOP UnityContainer.AddNewExtension<Interception>() .RegisterType<IBarService, BarSerice>() .Configure<Interception>() .SetInterceptorFor<IBarService>(new InterfaceInterceptor()); } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { if (null == controllerType) { return null; } return (IController)UnityContainer.Resolve(controllerType); } }
在構造函數裡面使用Unity容器引入IOC和AOP,這是特別重要的:
/// unity container 的AOP可以完成IOC的功能,在我們使用AOP的時候 /// 也就完成了依賴項的實例化。 UnityContainer = new UnityContainer(); UnityContainer.AddNewExtension<Interception>() .RegisterType<IFooRepository, FooRepository>() .RegisterType<IBarRepository, BarRepository>() .RegisterType<IFooService, FooService>() /// FooService的AOP .Configure<Interception>() .SetInterceptorFor<IFooService>(new InterfaceInterceptor()); /// BarSerice的AOP UnityContainer.AddNewExtension<Interception>() .RegisterType<IBarService, BarSerice>() .Configure<Interception>() .SetInterceptorFor<IBarService>(new InterfaceInterceptor());
查看FooSercice類和BarService類,我們在兩個方法裡面使用了AOP註入,這點是要在Unity構造函數中,用unity容器的創建AOP,AOP的實現是基於IFooService介面與FooService類,IBarService介面和BarService類的。
接下來我們需要替換調用MVC框架中的預設控制器工廠,在Global.asax文件中的Application_Start()方法中:
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory());
這樣就完成了替換。
最後就是我們的AOP實現了,對於AOP的實現,其實沒有什麼好說的,我在之前的博客裡面寫過,隨後我會給出鏈接。
這篇博客的重點是在如果完成一系列的IOC和AOP的註入操作。重點就是UnityControllerFactory類的構造函數裡面的註入代碼。
程式項目:
鏈接:https://pan.baidu.com/s/1hGaMlU30RP90qnCrZTTNQA 密碼:dmg8
轉發請註明出處:https://home.cnblogs.com/u/zhiyong-ITNote/