Unity容器的简单AOP与DI的应用Demo(基于asp.net mvc框架)
转发请注明出处: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/
Unity容器的简单AOP与DI的应用Demo(基于asp.net mvc框架)的更多相关文章
- 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--AOP编程
AOP编程在目前来说好像是大家都比较喜欢的.ASP.NET MVC中的Filter就是使用AOP实现的配置器模式.AOP在编码中的应用主要有如下几个方面: 日志记录,跟踪,优化和监控 事务的处理 持久 ...
- asp.net -mvc框架复习(6)-基于MVC实现简单计算器
1.创建好文件夹 2.视图层代码编写 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dyn ...
- asp.net -mvc框架复习(5)-ASP.NET MVC中的视图简单使用
1.视图分类 ASPX视图(现在讲解) Razor视图(后面讲解) ASPX 视图: 2.@page指令 作用:页面的声明 要求:必须放在第一行,常用指令属性如下: 3.服务器端内嵌语法 小脚本:在A ...
- Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”
整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...
- 从抽象谈起(三):AOP编程和ASP.NET MVC
AOP(Aspect oriented programming)面向切面编程.说成切面不容易理解,代码哪里有切面?又不是三维物体.概念不管,我们从其思想来理解这个名词吧. AOP的主要思想是把相同.相 ...
- Unity + iBatis + Asp.net Mvc 系统搭建
Unity + iBatis + Asp.net Mvc 系统搭建 之前用EntityFramework Code First做了一些小项目,很是方便:后来在一个 Java 项目中接触了myBatis ...
- AOP编程和ASP.NET MVC
AOP编程和ASP.NET MVC AOP(Aspect oriented programming)面向切面编程.说成切面不容易理解,代码哪里有切面?又不是三维物体.概念不管,我们从其思想来理解这个名 ...
- 自己动手写一个简单的MVC框架(第二版)
一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.W ...
- 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造
第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造 MVC默认模板的视觉设计从MVC1到MVC3都没有改变,比较陈旧了:在MVC4中做了升级,好看些,在不同的分辨率下,也能工作得 ...
随机推荐
- java爬虫笔记
一.URl解释 1.URl统一资源定位符, Uniform Resource Location 也就是说是Internet上信息资源的字符串,所谓的网页抓取就是把URl地址中指定的网络资源从网络中读取 ...
- lightoj1214 大数取模模板
#include<bits/stdc++.h> using namespace std; #define maxn 300 #define ll long long ll a,b; ]; ...
- CF1000G
蜜汁树形dp... 首先分析一下:他要求一条边至多只能经过两次,那么很容易会发现:从x到y这一条路径上的所有边都只会被经过一次.(如果过去再回来那么还要过去,这样就三次了,显然不合法) 那么其他能产生 ...
- bzoj 1812
什么鬼noip互测题... 这题很显然是树形dp,但设计状态以及转移是个难点 记状态f[i][j][k]表示以i为根节点的子树,离i最近的祖宗节点编号为j放了虫洞(伐木场?),i的子树内放了k个伐木场 ...
- linux下搭建SVN
官网下载: http://subversion.apache.org/packages.html SVN客户端:TortoiseSVN :https://tortoisesvn.net/downl ...
- jQuery 常用的方法
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
- Spring-data-redis: serializer实例
spring-data-redis提供了多种serializer策略,这对使用jedis的开发者而言,实在是非常便捷.sdr提供了4种内置的serializer: JdkSerializationRe ...
- jenkins+git+maven 增量部署思路以及相关脚本
之前通过jenkins+Git+maven这种方式打war包然后scp到测试环境使用,但是现在项目组要求打增量包,即只部署修改的文件和配置文件. 核心问题:如何获取到变动的文件??? 前置条件:初始化 ...
- RabbitMQ在java中基础使用
RabbitMQ相关术语: 1.Broker:简单来说就是消息队列服务器实体. 2.Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列. ...
- tomcat和server安装和操作
servers的创建 最后一步:ctrl+s