.NetCore【工作应用】Unity
阅读原文时间:2023年07月08日阅读:1

Unity是一个IoC容器,用来实现依赖注入(Dependency Injection,DI),减少耦合

install-package Unity


            IUnityContainer container = new UnityContainer();//1、定义一个空容器
            container.RegisterType<IDbInterface, DbMSSQL>();//2、注册类型,表示遇到IDbInterface的类型,创建DbMSSQL的实例
            var db = container.Resolve<IDbInterface>();

注入方式

  • 构造函数注入

  • 属性注入

  • 方法注入

三种注入方式的执行顺序:构造函数注入->属性注入->方法注入

默认情况下如果构造函数上面没有使用特性,那么默认找参数最多的构造函数执行注入

生命周期

  • 瞬时生命周期

    无状态或者轻量的,使用不太频繁的临时对象

  • 单例

    整个应用,计数器,单例的服务

  • 线程单例

    一个请求

  • 其他生命周期

    • 解析生命周期

    • 分层生命周期

配置文件

  1. 安装包

    install-package Unity.Interception.Configuration

  2. 配置文件

如果是单独文件的话需要设置为始终复制

<configuration>
    <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
    </configSections>
    <unity>
        <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
        <containers>
            <container name="testContainer">
                <!--逗号前面是接口类型的完全限定名:命名空间+接口名称,逗号后面是DLL文件的名称 name解决同一个接口不同实例问题-->
                <register type="Demo.IocUnity.IDbInterface,Demo.IocUnity" mapTo="Demo.IocUnity.DbMSSQL, Demo.IocUnity" name="sql"/>
                <register type="Demo.IocUnity.IDbInterface,Demo.IocUnity" mapTo="Demo.IocUnity.DbOracle, Demo.IocUnity" name="oracle"/>
            </container>
        </containers>
    </unity>
</configuration>
  1. 读取配置实现

            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
            fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Unity.config");//找配置文件的路径
            Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
            UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
            IUnityContainer container = new UnityContainer();
        section.Configure(container, "testContainer");
        IDbInterface db = container.Resolve&lt;IDbInterface&gt;("sql");</code></pre></li>

实现原理

  • 反射

    如何找构造函数

  • dictionary映射

    单例和线程单例实现的区别:ThreadLocal

    ThreadLocal的主要作用是让各个线程维持自己的变量

源码

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章