当前位置: 首页 > news >正文

IOC、DI<4> Unity、AOP、MVCAOP、UnityAOP 区别

IOC():控制反转,把程序上层对下层的依赖,转移到第三方的容器来装配
是程序设计的目标,实现方式包含了依赖注入和依赖查找(.net里面只有依赖注入)
DI:依赖注入,是IOC的实习方式。
在这里插入图片描述

在这里插入图片描述

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity;
using ZEN.Interface;
using ZEN.Service;namespace UnityIOC
{class Program{static void Main(string[] args){//定义一个IOC容器IUnityContainer container = new UnityContainer();//添加映射关系container.RegisterType<ICar, TeslaCar>();//获取服务var car = container.Resolve<ICar>();car.GetName();car.GetPrice();car.GetMaxSpeed();Console.ReadKey();}}
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

一个接口多个实现进行注册

如: 接口 IPhone
实现华为手机 继承 IPhone
实现苹果手机 继承 IPhone

IUnityContainer container = new UnityContainer();//1、定义一个空容器
container.RegisterType<IPhone, HuaweiPhone>(“huawei”);//2、注册类型,表示遇到IDbInterface的类型,创建DbMSSQL的实例
container.RegisterType<IPhone, ApplePhone>(“apple”);//表示遇到IDbInterface的类型,创建DbMSSQL的实例
var huawei= container.Resolve(“huawei”);
var apple= container.Resolve(“apple”);
Console.WriteLine(huawei.xxx());
Console.WriteLine(apple.xxx());

在这里插入图片描述
在这里插入图片描述

以上还是依赖细节,完全脱离细节,需要用配置文件,跟autofac一样

在这里插入图片描述
这样每次生成,才会把配置文件生成到bin目录下

在这里插入图片描述

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/27471038b94244c0920e55d1b8db4e4b.png

会发现,如果改成使用配置文件的方式实现的话,代码里面就不会依赖于细节了,只要一个接口类型。既然没有细节了,那么对项目进行如下的改造:把引用里面对细节的引用都去掉(ZEN.Service),然后Debug文件夹里面没有这个DLL了,但是这时需要把这个DLL复制到Debug目录下面,否则程序运行的时候会找不到具体实现的类型。这样就意味着程序架构只依赖于接口。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Unity.Configuration" /></configSections><unity><typeAliases><typeAlias  alias="IPhone" type="ZEN.Interface.IPhone,ZEN.Interface"></typeAlias ><typeAlias  alias="IWork" type="ZEN.Interface.IWork,ZEN.Interface"></typeAlias ><typeAlias  alias="IPower" type="ZEN.Interface.IPower,ZEN.Interface"></typeAlias ><typeAlias  alias="ICar" type="ZEN.Interface.ICar,ZEN.Interface"></typeAlias ><typeAlias  alias="Phone" type="ZEN.Service.Phone,ZEN.Service"></typeAlias ><typeAlias  alias="Work" type="ZEN.Service.Work,ZEN.Service"></typeAlias ><typeAlias  alias="Power" type="ZEN.Service.Power,ZEN.Service"></typeAlias ><typeAlias  alias="Car" type="ZEN.Service.TeslaCar,ZEN.Service"></typeAlias ></typeAliases><sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration" /><containers><container name="testContainer"><register type="IPhone" mapTo="Phone" /><register type="IPower" mapTo="Power" /><register type="ICar" mapTo="Car" name="tesla" ><property name="work" dependencyType="IWork" /><property name="phone" dependencyType="IPhone" /></register><register type="IWork" mapTo="Work" />     </container></containers></unity>
</configuration>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity;using ZEN.Interface;
using System.Configuration;
using Microsoft.Practices.Unity.Configuration;
using Unity.Interception;
using Unity.Interception.Interceptors.InstanceInterceptors.InterfaceInterception;
using Microsoft.Practices.Unity;namespace UnityIOC
{class Program{static void Main(string[] args){//{ //定义一个IOC容器//    IUnityContainer container = new UnityContainer();//    //添加映射关系      //    container.RegisterType<ICar, TeslaCar>("tesla");//    container.RegisterType<ICar, XiaoMICar>("xiaomi");//    container.RegisterType<IWork, Work>();//    container.RegisterType<IPower, Power>();//    container.RegisterType<IPhone, Phone>();//    //获取服务//    var car = container.Resolve<ICar>("tesla");//    car.GetName();//    car.GetPrice();//    car.GetMaxSpeed();//}{//ExeConfigurationFileMap 要引入 System.Configuration;ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config");//找配置文件的路径Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);IUnityContainer container = new UnityContainer();section.Configure(container, "testContainer");var car = container.Resolve<ICar>("tesla");car.GetName();car.GetPrice();car.GetMaxSpeed();//}Console.ReadKey();}}
}

在这里插入图片描述

构造函数注入、属性注入、方法注入 配置文件

在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Unity.Configuration" /></configSections><unity><typeAliases><typeAlias  alias="IPhone" type="ZEN.Interface.IPhone,ZEN.Interface"></typeAlias ><typeAlias  alias="IWork" type="ZEN.Interface.IWork,ZEN.Interface"></typeAlias ><typeAlias  alias="IPower" type="ZEN.Interface.IPower,ZEN.Interface"></typeAlias ><typeAlias  alias="ICar" type="ZEN.Interface.ICar,ZEN.Interface"></typeAlias ><typeAlias  alias="Phone" type="ZEN.Service.Phone,ZEN.Service"></typeAlias ><typeAlias  alias="Work" type="ZEN.Service.Work,ZEN.Service"></typeAlias ><typeAlias  alias="Power" type="ZEN.Service.Power,ZEN.Service"></typeAlias ><typeAlias  alias="Car" type="ZEN.Service.TeslaCar,ZEN.Service"></typeAlias ></typeAliases><sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration" /><containers><container name="testContainer"><register type="IPhone" mapTo="Phone" /><register type="IPower" mapTo="Power" /><register type="ICar" mapTo="Car" name="tesla" ><property name="work" dependencyType="IWork" /><property name="phone" dependencyType="IPhone" /><method name="InitIphone"><param name="_power" type="IPower" /><param name="val" type="int" value="33"/></method></register><register type="IWork" mapTo="Work" />     </container></containers></unity>
</configuration>
  ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config");//找配置文件的路径Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);IUnityContainer container = new UnityContainer();section.Configure(container, "testContainer");var car = container.Resolve<ICar>("tesla");car.GetName();car.GetPrice();car.GetMaxSpeed();

在这里插入图片描述
unity IOC 源码

Unity AOP

在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Unity.Configuration" /></configSections><unity><typeAliases><typeAlias  alias="IPhone" type="ZEN.Interface.IPhone,ZEN.Interface"></typeAlias ><typeAlias  alias="IWork" type="ZEN.Interface.IWork,ZEN.Interface"></typeAlias ><typeAlias  alias="IPower" type="ZEN.Interface.IPower,ZEN.Interface"></typeAlias ><typeAlias  alias="ICar" type="ZEN.Interface.ICar,ZEN.Interface"></typeAlias ><typeAlias  alias="Phone" type="ZEN.Service.Phone,ZEN.Service"></typeAlias ><typeAlias  alias="Work" type="ZEN.Service.Work,ZEN.Service"></typeAlias ><typeAlias  alias="Power" type="ZEN.Service.Power,ZEN.Service"></typeAlias ><typeAlias  alias="Car" type="ZEN.Service.TeslaCar,ZEN.Service"></typeAlias ></typeAliases><sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration" /><containers><container name="testContainer"><!AOP  需要添加这个节点  <extension type="Interception"/>/>--><extension type="Interception"/><register type="IPhone" mapTo="Phone" /><register type="IPower" mapTo="Power" /><register type="ICar" mapTo="Car" name="tesla" ><property name="work" dependencyType="IWork" /><property name="phone" dependencyType="IPhone" /><method name="InitIphone"><param name="_power" type="IPower" /><param name="val" type="int" value="33"/></method><interceptor type="InterfaceInterceptor"/><interceptionBehavior type="IOC.Common.IOC_AOP.AOP, IOC.Common"/></register><register type="IWork" mapTo="Work" />     </container></containers></unity>
</configuration>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity.Interception.InterceptionBehaviors;
using Unity.Interception.PolicyInjection.Pipeline;namespace IOC.Common.IOC_AOP
{/// <summary>/// 不需要特性/// </summary>public class AOP : IInterceptionBehavior{public bool WillExecute{get { return true; }}public IEnumerable<Type> GetRequiredInterfaces(){return Type.EmptyTypes;}public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext){Console.WriteLine("IOC-AOP触发");return getNext().Invoke(input, getNext);}}
}

MVC中的Filter过滤器也起到AOP功能,但与unity的AOP

有所不同
mvc中的过滤器是针对action的,action前,action后
unity框架的AOP 可以针对 方法

Filter可以在action前 后 异常都扩展逻辑 AOP—针对action完整方法
Unity容器的AOP也是需要的, AOP—针对方法里面的业务层扩展的

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python编程实例 输出两个数之间的素数
  • Vue中实现在线画流程图实现
  • 解决后端限制导致前端配置跨域仍请求失败报504的问题
  • 如何在 Ubuntu 16.04 上安装和配置 Zabbix 以安全监控远程服务器
  • 应急响应-战后溯源反制社会工程学
  • C++ 实现图书馆资料管理系统
  • lvs集群、NAT模式和DR模式、keepalive
  • wifi中的PSR技术
  • Java Stream API详解:高效处理集合数据的利器
  • 休息时间c++
  • Java对象创建究竟是在栈上还是堆上??
  • FPGA上板项目(一)——点灯熟悉完整开发流程、ILA在线调试
  • 【C语言】《回调函数》详细解析
  • 探索最佳海外代理服务商!你知道哪些?
  • Java面试题系列 - 第10天
  • 77. Combinations
  • Android框架之Volley
  • CentOS6 编译安装 redis-3.2.3
  • echarts的各种常用效果展示
  • Java比较器对数组,集合排序
  • mockjs让前端开发独立于后端
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 不上全站https的网站你们就等着被恶心死吧
  • 分布式熔断降级平台aegis
  • 回顾 Swift 多平台移植进度 #2
  • 检测对象或数组
  • 简单易用的leetcode开发测试工具(npm)
  • 将回调地狱按在地上摩擦的Promise
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 阿里云ACE认证之理解CDN技术
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • !!Dom4j 学习笔记
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (~_~)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (arch)linux 转换文件编码格式
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (二)linux使用docker容器运行mysql
  • (四)linux文件内容查看
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .bat文件调用java类的main方法
  • .DFS.
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性