Unity 容器简单使用方法

Unity 容器简单使用方法

1、添加 Nuget 包引用

搜索并安装 Unity.Configuration 包,会自动添加依赖包(Unity.Container、Unity.Abstractions、 System.Runtime.CompilerServices.Unsafe):

 

 

2、准备配置文件

此处演示构造函数注入:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration" />
  </configSections>

  <unity>
    <containers>
      <container>

        <!--将实现类与接口匹配-->
        <register type="Zmm.CardRS.ICardRS, Zmm.Inteface" mapTo="Zmm.CardRS.Com.ACT, Zmm.Dll">
            <!--生命周期:单例-->
            <lifetime type="singleton" />
            
            <!--构造函数注入-->
            <constructor>
              <!--构造函数参数1-->
              <param name="comNo" value="5"></param>
              <!--构造函数参数2-->
              <param name="address" value="15"></param>
            </constructor>
        </register>
		
      </container>
    </containers>
  </unity>

</configuration>

 

3、初始化容器

//定义.exe应用程序的配置文件映射;
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
//指定配置文件路径;
fileMap.ExeConfigFilename = Settings.Default.ConfigPath;

//配置文件类;
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
//Unity 的配置区;
UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection("unity");

//实例化容器;
IUnityContainer _UC = new UnityContainer();
//载入配置并注入;
_UC.LoadConfiguration(section);
//加上这句可显示注入时产生错误的详细信息;
_UC.AddExtension(new Diagnostic());

 

如果使用默认的 app.config,则可以简化为:

//使用默认的配置文件;
_UC = new UnityContainer();
_UC.LoadConfiguration();
_UC.AddExtension(new Diagnostic());

 

4、使用注入的类

使用容器的 Resolve 方法取出要使用的类:

ICardRS _CardRS = _UC.Resolve<ICardRS>();

 

5、嵌套注入

新建一个类来测试嵌套注入的情况:

public class Test
{
    [Unity.Dependency]
    public ICardRS _CardRS;
}

 

类 Test 中添加了一个公共的(不能是私有的)成员,并使用 [Unity.Dependency] 特性标记,表明它需要注入。

 

然后可以用容器的 RegisterSingleton 方法注册 Test 类,使用时同样用 Resolve 方法取出:

_UC.RegisterSingleton<Test>();
Test test = _UC.Resolve<Test>();

 

调试时可以看到 Test 类中需要注入的成员已经自动注入了:

 

 

那么如果在 Test 类中的方法要使用它,则直接使用即可,无需再进行实例化或者解析(取出)操作。

 

【转载请注明出处 Http://dlgcy.com】

打印本文

发表评论