欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用Unity容器实现属性注入

程序员文章站 2022-04-09 08:54:07
简介 Unity :是微软用C#实现的轻量级,可扩展的依赖注入容器。 控制反转:(Inversion of Control,缩写为IoC),是用来消减程序之间的耦合问题,把程序中上层对下层依赖,转移到一个第三方容器中来装配。 依赖注入:(Dependency Injection,缩写为DI):我们向 ......

简介

unity :是微软用c#实现的轻量级,可扩展的依赖注入容器。

控制反转:(inversion of control,缩写为ioc),是用来消减程序之间的耦合问题,把程序中上层对下层依赖,转移到一个第三方容器中来装配。

依赖注入:(dependency injection,缩写为di):我们向容器发出请求以后,获得这个对象实例的过程就叫依赖注入。

实现

使用nuget程序包添加引用:

输入unity.configuration搜索并下载会自动添加所需的包(unity.container,system.runtime.compilerservices.unsafe,unity.abstractions)

 使用Unity容器实现属性注入

配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configsections>
  <!--定义配置节处理程序与配置元素之间的关联。-->
    <section name="unity" type="microsoft.practices.unity.configuration.unityconfigurationsection,unity.configuration" />
  </configsections>
  <unity>
    <containers>
      <container>
        <!--type为对象的名称,mapto为注入对象的名称 写法为用逗号隔开两部分,一是类的全部,包括命名空间,二是程序集名称-->
        <register type="yk.interface.ipms,yk.interface" mapto="yk.pms.xlp.bjaite,yk.pms.xlp.bjaite">
          <lifetime type="singleton" />
          <!--api接口-->
          <property name="url" value="*****"></property>
          <!--用户名-->
          <property name="username" value="*****" />
          <!--密码-->
          <property name="userpassword" value="*****"/>
        </register>      
      </container>
    </containers>
  </unity>
</configuration>

配置文件初始化:

var configfilenames = directory.getfiles(@"d:\ykconfig", "*.config");
if (configfilenames.length != 1)
{
 messagebox.show($@"d:\ykconfig文件夹里面必须只能一个配置文件,现在有{configfilenames.length}个");
 return;
}

var filemap = new execonfigurationfilemap
{
 execonfigfilename = configfilenames[0]
};
//从config文件中读取配置信息
var configuration = configurationmanager.openmappedexeconfiguration(filemap, configurationuserlevel.none);
//获取指定名称的配置节
var section = (unityconfigurationsection)configuration.getsection("unity");
//创建容器
var _uc = new unitycontainer();
//载入容器
section.configure(_uc);

在vmmainwindow里添加公共成员,并用 [dependency]在上方标记:

 [dependency]
 public ipms pms { get; set; }

用registersingleton去注册:

_uc.registersingleton<vmmainwindow>();

最后使用resolve去解析:

var vmmain = uc.resolve<vmmainwindow>();

这样就获取到了容器里面的内容。