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

news2024/11/16 4:26:57

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—针对方法里面的业务层扩展的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络文明】关注网络安全

在这个数字化时代&#xff0c;互联网已成为我们生活中不可或缺的一部分&#xff0c;它极大地便利了我们的学习、工作、娱乐乃至日常生活。然而&#xff0c;随着网络空间的日益扩大&#xff0c;网络安全问题也日益凸显&#xff0c;成为了一个不可忽视的全球性挑战。认识到网络安…

Gitee简易使用流程(后期优化)

目录 1.修改用户名 2.文件管理 新建文件/文件夹流程如下&#xff1a; 上传文件流程如下&#xff1a; 以主页界面为起点 1.修改用户名 点解右上角的头像--> 点击“账号设置” 点击左边栏里的“个人资料“ 直接修改用户名即可 2.文件管理 选择一个有修改权限仓库&#…

【轻松拿捏】Java-final关键字(面试)

目录 1. 定义和基本用法 回答要点&#xff1a; 示例回答&#xff1a; 2. final 变量 回答要点&#xff1a; 示例回答&#xff1a; 3. final 方法 回答要点&#xff1a; 示例回答&#xff1a; 4. final 类 回答要点&#xff1a; 示例回答&#xff1a; 5. final 关键…

yolov8预测

yoloV8 官方地址 预测 -Ultralytics YOLO 文档 1.图片预测 from ultralytics import YOLO #### 图片预测1 ### https://www.youtube.com/watch?vneBZ6huolkg ### https://github.com/ultralytics/ultralytics ### https://github.com/abdullahtarek/football_analysis…

Linux C语言基础 day10

目录 学习目标&#xff1a; 学习内容&#xff1a; 1.指针指向数组 1.1 指针与数组的关系 1.2 指针与一维数组关系实现 1.2.1 指针与一维数组的关系 1.2.2 指针指向一维整型数组作为函数参数传递 课外作业&#xff1a; 学习目标&#xff1a; 一周掌握 C基础知识 学习内…

专业条码二维码扫描设备和手机二维码扫描软件的区别?

条码二维码技术已广泛应用于我们的日常生活中&#xff0c;从超市结账到公交出行&#xff0c;再到各类活动的入场验证&#xff0c;条码二维码的便捷性不言而喻&#xff0c;而在条码二维码的扫描识别读取过程中&#xff0c;专业扫描读取设备和手机二维码扫描软件成为了两大主要工…

uniapp使用多列布局显示图片,一行两列

完整代码&#xff1a; <script setup>const src "https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/shuijiao.jpg" </script><template><view class"content"><view class"img-list"><image :src"src…

日志自动分析-操作系统-GscanLogonTracerf8x

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

TCP连接的三次握手和断开的四次挥手

TCP连接的建立过程通过三次握手完成&#xff0c;‌而连接的关闭过程则通过四次挥手完成。‌ 三次握手&#xff1a;‌这是TCP连接建立的过程&#xff0c;‌主要目的是确保双方都准备好进行数据传输。‌具体步骤如下&#xff1a;‌ 客户端向服务器发送一个SYN报文&#xff0c;‌请…

Canvas:实现在线动态时钟效果

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…

利用宝塔安装一套linux开发环境

更新yum&#xff0c;并且更换阿里镜像源 删除yum文件 cd /etc/yum.repos.d/ 进入yum核心目录 ls sun.repo rm -rf * 删除之前配置的本地源 ls 配置阿里镜像源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 配置扩展包 wge…

【JavaScript 算法】深度优先搜索:探索所有可能的路径

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、优化与扩展五、总结 深度优先搜索&#xff08;Depth-First Search, DFS&#xff09;是一种用于遍历或搜索图或树数据结构的算法。该算法尽可能深入图的分支&#xff0c;探索所有可…

【Lora模型推荐】Stable Diffusion创作具有玉石翡翠质感的图标设计

站长素材AI教程是站长之家旗下AI绘图教程平台 海量AI免费教程&#xff0c;每日更新干货内容 想要深入学习更多AI绘图教程&#xff0c;请访问站长素材AI教程网&#xff1a; AI教程_深度学习入门指南 - 站长素材 (chinaz.com) logo版权归各公司所有&#xff01;本笔记仅供AIGC…

防火墙的NAT策略以及智能选路

一、实验拓扑 二、实验要求 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9&#xff0c;多出口环境基于带宽比例进…

【机器学习】逻辑回归的原理、应用与扩展

文章目录 一、逻辑回归概述二、Sigmoid函数与损失函数2.1 Sigmoid函数2.2 损失函数 三、多分类逻辑回归与优化方法3.1 多分类逻辑回归3.2 优化方法 四、特征离散化 一、逻辑回归概述 逻辑回归是一种常用于分类问题的算法。大家熟悉的线性回归一般形式为 Y a X b \mathbf{Y}…

2024辽宁省大学生数学建模竞赛(C题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024电工杯数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解…

Redis vs Memcache:哪个更适合你的应用?

Redis vs Memcache&#xff1a;哪个更适合你的应用&#xff1f; 1、存储与持久化2、数据类型支持3、性能与底层机制4、Value值大小限制5、数据备份与容灾6、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在缓存技术的选择中&#xff…

CV08_深度学习模块之间的缝合教学(3)--加载预训练权重

1.1 引言 我们在修改网络模型&#xff0c;添加或删除模块&#xff0c;或者更改了某一层之后&#xff0c;直接加载原先的预训练权重&#xff0c;肯定是会报错的&#xff0c;因为原来的模型权重和修改后的模型权重之间的结构是不匹配的。 那么我们只想加载那些没有更改过的那个…

Python酷库之旅-第三方库Pandas(020)

目录 一、用法精讲 49、pandas.merge_asof函数 49-1、语法 49-2、参数 49-3、功能 49-4、返回值 49-5、说明 49-5-1、功能 49-6、用法 49-6-1、数据准备 49-6-2、代码示例 49-6-3、结果输出 50、pandas.concat函数 50-1、语法 50-2、参数 50-3、功能 50-4、返…

中仕公考:没有教师资格证能考编吗?

没有教师资格证的考生&#xff0c;是不能参加教师编考试的。但是&#xff0c;符合“先上岗&#xff0c;再考证”的阶段性措施&#xff0c;高校毕业生可在未获得教师资格证的情况下先行就业。其他考生必须首先取得教师资格证&#xff0c;才能参与教师编考试。 报考普通小学和幼…