IOC控制反转和DI依赖注入

在程序设计时,分层是必须的,高层模块不应依赖于低层模块,通常两者通过抽象来依赖,而不要依赖细节,这就是DIP依赖倒置原则。而实现依赖倒置原则时,左边能抽象,右边实例化时不能直接使用抽象,这也就必须借助于第三方的方式。通常可以通过容器来定义细节,去掉对低层的依赖,这样设计的话程序架构就会具备良好的扩展性和稳定性。
DI依赖注入:跟IOC控制反转就是一对双生兄弟,DI是用来实现IOC的一种手段,在构造对象的时候,会自动初始化对象所需要的对象。注入方式包括:(1)构造函数注入;(2)属性注入;(3)方法注入,这三种方式本质都是通过反射。
Unity是实现DI依赖注入的许多框架中的一种。
使用方法:
1.Unity容器初步应用
(1)安装Unity:引用Unity.Abstractions,Unity.Configuration,Unity.Container,Unity.Interception,Unity.Interception.Configuration
(1)实例化一个空容器(建议一个程序就实例化一个容器,可是使用单例设计模式)
(2)注册类型
(3)通过容器生成对象

            IUnityContainer container = new UnityContainer();//1 空容器
            container.RegisterType<IPhone, AndroidPhone>();//2 注册类型
            container.RegisterType<AbstractPad, ApplePad>();
            //container.RegisterType<ApplePad, ApplePadChild>();
            container.RegisterInstance<ITV>(new AppleTV(123));


            var phone = container.Resolve<IPhone>();
            var pad = container.Resolve<AbstractPad>();
            //var pad2 = container.Resolve<ApplePad>();
            var tv = container.Resolve<ITV>();

2.一对多注册

            IUnityContainer container = new UnityContainer();//1 空容器
            container.RegisterType<IPhone, ApplePhone>();//2 注册类型
            container.RegisterType<IPhone, AndroidPhone>("android");
            container.RegisterType<IPhone, ApplePhone>("apple");
            container.RegisterType<IHeadphone, Headphone>();
            container.RegisterType<IMicrophone, Microphone>();
            container.RegisterType<IPower, Power>();
           
            var phone = container.Resolve<IPhone>();
            var android = container.Resolve<IPhone>("android");
            var apple = container.Resolve<IPhone>("apple");

3.生命周期管理

IUnityContainer container = new UnityContainer();
container.RegisterType<IPhone, AndroidPhone>();
container.RegisterType<IPhone, AndroidPhone>(new TransientLifetimeManager());//默认  瞬时  每一次都是全新生成
container.RegisterType<IPhone, AndroidPhone>(new ContainerControlledLifetimeManager());//容器单例  单例就不要自己实现

container.RegisterType<IPhone, AndroidPhone>(new PerThreadLifetimeManager());//线程单例

container.RegisterType<IPhone, AndroidPhone>(new HierarchicalLifetimeManager());//分级容器单例
IUnityContainer childContainer = container.CreateChildContainer();

container.RegisterType<IPhone, AndroidPhone>(new ExternallyControlledLifetimeManager());//外部可释放单例

container.RegisterType<IPhone, AndroidPhone>(new PerResolveLifetimeManager());//循环引用 不推荐

4.配置文件使用

<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
    <!--Microsoft.Practices.Unity.Configuration.UnityConfigurationSection-->
  </configSections>
  <unity>
    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
    <containers>
      <container name="aopContainer">
        <register type="MyAOP.UnityWay.IUserProcessor,MyAOP" mapTo="MyAOP.UnityWay.UserProcessor,MyAOP"/>
      </container>
    </containers>
  </unity>
</configuration>

5.AOP配置
配置文件

      <container name="testContainerAOP">
        <extension type="Interception"/>
        <register type="AOP.Interface.IPhone,AOP.Interface" mapTo="AOP.Service.AndroidPhone, AOP.Service.Extend">
          <interceptor type="InterfaceInterceptor"/>
          <interceptionBehavior type="AOP.Framework.AOP.AuthorizeBehavior, AOP.Framework"/>
          <interceptionBehavior type="AOP.Framework.AOP.SmsBehavior, AOP.Framework"/>
          <interceptionBehavior type="AOP.Framework.AOP.ExceptionLoggingBehavior, AOP.Framework"/>
          <interceptionBehavior type="AOP.Framework.AOP.CachingBehavior, AOP.Framework"/>
          <interceptionBehavior type="AOP.Framework.AOP.LogBeforeBehavior, AOP.Framework"/>
          <interceptionBehavior type="AOP.Framework.AOP.ParameterCheckBehavior, AOP.Framework"/>
          <interceptionBehavior type="AOP.Framework.AOP.LogAfterBehavior, AOP.Framework"/>
        </register>
        <register type="AOP.Interface.IPhone,AOP.Interface" mapTo="AOP.Service.AndroidPhone, AOP.Service.Extend" name="Android"/>
        <register type="AOP.Interface.IMicrophone, AOP.Interface" mapTo="AOP.Service.Microphone, AOP.Service.Extend"/>
        <register type="AOP.Interface.IHeadphone, AOP.Interface" mapTo="AOP.Service.Headphone, AOP.Service.Extend"/>
        <register type="AOP.Interface.IPower, AOP.Interface" mapTo="AOP.Service.Power, AOP.Service.Extend"/>
        <register type="AOP.IDAL.IBaseDAL, AOP.IDAL" mapTo="Ruamou.DAL.BaseDAL, Ruamou.DAL">
        </register>
      </container>

C#代码


                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, "testContainerAOP");
                IPhone phone = container.Resolve<IPhone>();
                phone.Call();

                IPhone android = container.Resolve<IPhone>("Android");
                android.Call();

版权声明:本文为licong1520原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。