IOC、DI<4> Unity、AOP

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 可以针对 方法

相关推荐

  1. 4/4 清明work

    2024-07-10 17:04:01       21 阅读
  2. <span style='color:red;'>4</span>.<span style='color:red;'>4</span>总结

    4.4总结

    2024-07-10 17:04:01      23 阅读
  3. <span style='color:red;'>4</span>.<span style='color:red;'>4</span>C++

    4.4C++

    2024-07-10 17:04:01      25 阅读
  4. 分布式(4

    2024-07-10 17:04:01       40 阅读
  5. CSS-<span style='color:red;'>4</span>

    CSS-4

    2024-07-10 17:04:01      44 阅读
  6. DevOps(4)

    2024-07-10 17:04:01       40 阅读
  7. QTday<span style='color:red;'>4</span>

    QTday4

    2024-07-10 17:04:01      38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 17:04:01       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 17:04:01       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 17:04:01       4 阅读
  4. Python语言-面向对象

    2024-07-10 17:04:01       5 阅读

热门阅读

  1. HarmonyOS应用开发前景及使用工具

    2024-07-10 17:04:01       7 阅读
  2. JVM的基础介绍(1)

    2024-07-10 17:04:01       9 阅读
  3. 开源项目编译harbor arm架构的包 —— 筑梦之路

    2024-07-10 17:04:01       13 阅读
  4. 用户特征和embedding层做Concatenation

    2024-07-10 17:04:01       13 阅读