转发请注明出处: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/

最新文章

  1. 【hadoop】——MapReduce解压缩实现
  2. Visual Studio 创建WebServer
  3. BZOJ4454: C Language Practice
  4. C语言中的 extern 关键字
  5. php内存处理须知【转】
  6. CPU的频率、外频、倍频与超频
  7. 第一篇、微信小程序_01计算器
  8. 【COCOS2DX-对28游戏开发】 Cocos2d-x-3c 道路设计 CocosBase CocosNet CocosWidget
  9. zf-关于评价器的开关所在的配置文件,与代码如何修改。
  10. Unity编程标准导引-Unity中的基本概念-2.1界面概览
  11. 【响应式编程的思维艺术】 (5)Angular中Rxjs的应用示例
  12. Alan Turing的纪录片观后感
  13. [转]Node.JS使用Sequelize操作MySQL
  14. 百度软件开发实习生c++方向面经(一面)
  15. 61.纯 CSS 创作一只咖啡壶(这个不好看)
  16. JS进阶之---作用域,作用域链,闭包
  17. ERP完善合同起草(二十八)
  18. JS中lambda表达式的优缺点和使用场景(转)
  19. opencv各种绘图 直线 矩形 圆 椭圆
  20. hive优化之调整mapreduce数目

热门文章

  1. angularjs 监听 文档click 事件
  2. 如何修改PDF文件内容,PDF怎么添加背景
  3. 课外知识----ini
  4. hdu4990 转移矩阵
  5. zoj3659
  6. 判断三次URL可用性脚本
  7. ajax--参数默认值问题
  8. Android 第二波
  9. Python深度学习案例1--电影评论分类(二分类问题)
  10. h5在手机端实现简单复制