Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入(Constructor Injection)、属性注入(Property Injection),以及方法调用注入(Method Call Injection).

假设我们有下面的场景代码,在代码里面有一个很简单的customer对象,customer 对象有个save 方法, 这个方法通过调用ICustomerDataAccess.Save将数据持久到数据库中, 在列子中我们实现了dataaccess的sql版本和mysql版本,也就是说我们这个customer对象,可以支持持久化到sql server 或 mysql.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.Unity; namespace UnitySample
{
public interface ICustomerDataAccess
{
void Save(Customer c);
} public class CustomerSqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.Write("{2}, save data id:{0},name{1}",c.Id,c.Name,this.GetType().ToString());
}
} public class CustomerMysqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.Write("{2}, save data id:{0},name{1}", c.Id, c.Name, this.GetType().ToString());
}
} public class Customer
{
public ICustomerDataAccess CustomerDataAccess { get; set; } public string Id { get; set; }
public string Name { get; set; } public void Save()
{
CustomerDataAccess.Save(this);
}
} class Program
{
static void Main(string[] args)
{ }
}
}

传统做法可能是在配置文件中填几个一个变量 dbType = sql  or my sql. 然后在customer 对象中根据设定的db type 来实力化不同的dataaccess.

代码可能会是下面这个样子,这样的话,customer 对象实际上依赖于CustomerSqlDataAccess 和 CustomerSqlDataAccess 的,而且,未来比如要新增加其他数据库的支持,则必须修改customer 对象的源代码。

 public Customer()
{
if (DbType = "sql")
{
CustomerDataAccess = new CustomerSqlDataAccess();
}
else
{
CustomerDataAccess = new CustomerSqlDataAccess();
}
}

下面我们使用unity 来解除customer 对象对  CustomerSqlDataAccess 和 CustomerSqlDataAccess 的依赖。

一、 属性注入(Property Injection)

1.  配置unity

     为了以后调用方便,我这里建立了一个静态方法,然后注入了两个dataaccess。

 public class UnitySetup
{
public static void Config()
{
var container = new UnityContainer();
container.RegisterType<ICustomerDataAccess, CustomerSqlDataAccess>();
container.RegisterType<ICustomerDataAccess, CustomerSqlDataAccess>("mysql");
}
}

  然后我们需要在Main函数中调用这个方法配置unity containter.

  

     static void Main(string[] args)
{
UnitySetup.Config();
}

2. 标记属性注入

   这步很简单,直接在customer 类中的ICustomerDataAccess 定义上面添加[Dependency]标注即可。

[Dependency]
public ICustomerDataAccess CustomerDataAccess { get; set; }

3. 通过resove 获取对象

            var container = new UnityContainer();
UnitySetup.Config(container);
var sqlCustomer = container.Resolve<ICustomerDataAccess>();
var mysqlCustomer = container.Resolve<ICustomerDataAccess>("mysql");

上面的代码就分别获取了CustomerSqlDataAccess 实例和CustomerSqlDataAccess实例

二 、构造器注入(Constructor Injection)

1.  配置unity

  

  unityContainer.RegisterType<Customer>(
new InjectionConstructor(new ResolvedParameter<ICustomerDataAccess>()));
unityContainer.RegisterType<Customer>("mysqlCustomer",
new InjectionConstructor(new ResolvedParameter<ICustomerDataAccess>("mysql")));

添加两行注册customer 对想到container.

2. 获取

 var sqlCustomer = container.Resolve<Customer>();
var myqlCustomer = container.Resolve<Customer>("mysqlCustomer"); 完整代码如下
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.Unity; namespace UnitySample
{ public interface ICustomerDataAccess
{
void Save(Customer c);
} public class CustomerSqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.WriteLine("{2}, save data id:{0},name{1}",c.Id,c.Name,this.GetType().ToString());
}
} public class CustomerMysqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.WriteLine("{2}, save data id:{0},name{1}", c.Id, c.Name, this.GetType().ToString());
}
} public class UnitySetup
{
public static void Config(IUnityContainer unityContainer)
{
unityContainer.RegisterType<ICustomerDataAccess, CustomerSqlDataAccess>();
unityContainer.RegisterType<ICustomerDataAccess, CustomerMysqlDataAccess>("mysql");
unityContainer.RegisterType<Customer>(
new InjectionConstructor(new ResolvedParameter<ICustomerDataAccess>()));
unityContainer.RegisterType<Customer>("mysqlCustomer",
new InjectionConstructor(new ResolvedParameter<ICustomerDataAccess>("mysql")));
}
} public class Customer
{
private ICustomerDataAccess CustomerDataAccess { get; set;} public string Id { get; set; }
public string Name { get; set; } public Customer(ICustomerDataAccess customerDataAccess)
{
CustomerDataAccess = customerDataAccess;
}
public void Save()
{
CustomerDataAccess.Save(this);
}
} class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
UnitySetup.Config(container);
var sqlCustomer = container.Resolve<Customer>();
var myqlCustomer = container.Resolve<Customer>("mysqlCustomer"); sqlCustomer.Save();
myqlCustomer.Save(); Console.ReadKey();
}
}
}

三 、 方法调用注入(Method Call Injection)

方法调用注入和输入注入有点类似,只需要在调用的方法上面添加[InjectionMethod] 标注即可

1.  配置unity

  

 unityContainer.RegisterType<Customer>("mysqlCustomer",
new InjectionMethod("SetDataAccess", new ResolvedParameter<ICustomerDataAccess>("mysql")));

2. 获取

 var sqlCustomer = container.Resolve<Customer>();
var myqlCustomer = container.Resolve<Customer>("mysqlCustomer");

完成后的代码如下

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.Unity; namespace UnitySample
{ public interface ICustomerDataAccess
{
void Save(Customer c);
} public class CustomerSqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.WriteLine("{2}, save data id:{0},name{1}",c.Id,c.Name,this.GetType().ToString());
}
} public class CustomerMysqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.WriteLine("{2}, save data id:{0},name{1}", c.Id, c.Name, this.GetType().ToString());
}
} public class UnitySetup
{
public static void Config(IUnityContainer unityContainer)
{
unityContainer.RegisterType<ICustomerDataAccess, CustomerSqlDataAccess>();
unityContainer.RegisterType<ICustomerDataAccess, CustomerMysqlDataAccess>("mysql"); unityContainer.RegisterType<Customer>("mysqlCustomer",
new InjectionMethod("SetDataAccess", new ResolvedParameter<ICustomerDataAccess>("mysql")));
}
} public class Customer
{
private ICustomerDataAccess CustomerDataAccess { get; set;}
public string Id { get; set; }
public string Name { get; set; } public void Save()
{
CustomerDataAccess.Save(this);
} [InjectionMethod]
public void SetDataAccess(ICustomerDataAccess dataAccess)
{
CustomerDataAccess = dataAccess;
}
} class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
UnitySetup.Config(container);
var sqlCustomer = container.Resolve<Customer>();
var mysqlCustomer = container.Resolve<Customer>("mysqlCustomer");
sqlCustomer.Save();
mysqlCustomer.Save();
Console.ReadKey();
}
}
}

好了,通过使用unity 依赖注入,customer 对象不再依赖具体的CustomerSqlDataAccess 和 CustomerMysqlDataAccess., 只依赖于接口ICustomerDataAccess。

上面就是unity 的基本用法介绍。

使用Microsoft.Practices.Unity 依赖注入 转载https://www.cnblogs.com/slardar1978/p/4205394.html的更多相关文章

  1. 使用Microsoft.Practices.Unity 依赖注入

    Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...

  2. Microsoft.Practices.Unity 给不同的对象注入不同的Logger

    场景:我们做项目的时候常常会引用第三方日志框架来帮助我们记录日志,日志组件的用途主要是审计.跟踪.和调试.就说我最常用的日志组件log4net吧,这个在.NET同行当中应该算是用得非常多的一个日志组件 ...

  3. WPF Microsoft.Practices.Unity 注入大法简单示例

    最近新入职了公司,做WPF方向的项目,进来后看到这边大量运用了依赖注入来解耦,采用的是Microsoft.Practices.Unity. WPF的话,目前主要有两个技术来实现IOC,unity和ME ...

  4. Unity依赖注入(笔记)

    一.介绍 控制反转(Inversion of Control,简称IoC):整洁架构思想,不允许内部获知外部的存在,这就导致了我们必须在内层定义与外层交互的接口,通过依赖注入的方式将外层实现注入到内部 ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入

    系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unity.codeplex.com/rel ...

  6. Unity依赖注入使用详解

    写在前面 构造器注入 Dependency属性注入 InjectionMethod方法注入 非泛型注入 标识键 ContainerControlledLifetimeManager单例 Unity注册 ...

  7. 利用Microsoft.Practices.Unity的拦截技术,实现.NET中的AOP

    1.记住这个单词的意思:Interception(拦截) 2.首先说一下原理和背景 原理:所谓的AOP就是面向切面编程,这里不多说,百度搜索. 目的:个人认为是为了解耦,部分代码跟业务代码分离,业务代 ...

  8. 第九回 Microsoft.Practices.Unity.Interception实现基于数据集的缓存(针对六,七,八讲的具体概念和配置的解说)

    返回目录 概念 Microsoft.Practices.Unity.Interception是一个拦截器,它隶属于Microsoft.Practices.Unity组成之中,主要完成AOP的功能,而实 ...

  9. Unity 依赖注入知识点

    三种依赖注入方法,构造器注入.属性注入.方法注入 可以配置Config文件,来实现不用修改代码.需要先将接口与实体关联,然后使用时会自动加载对应实体. namespace WeChatConsole ...

随机推荐

  1. win10右键在此处打开CMD

    1.在网上找了好多发现都不能运行,最后找到一个靠谱的记下来,方便以后使用. 2.新建一个 .reg格式的脚本 Windows Registry Editor Version 5.00 [HKEY_CL ...

  2. oo_project_2java数据类型范围及测试

    数据类型范围测试 一.数字常数的编译问题 java中的常量数字默认以int型编译 如: long a = 1234567890; //十位 long b = 12345678900; //默认数据为i ...

  3. spring boot 尚桂谷学习笔记11 数据访问03 JPA

    整合JPA SpringData 程序数据交互结构图 (springdata jpa 默认使用 hibernate 进行封装) 使用之后就关注于 SpringData 不用再花多经历关注具体各个交互框 ...

  4. 斯坦福【概率与统计】课程笔记(三):EDA | 直方图

    单个定量变量的直方图表示 大家知道,定量变量是连续型变量,即不会像分类变量那样有明显的分类,那么如何将其画成直方图呢?一般来说,会将其按照某个维度来将其分组(group),举个例子. 我们有15个学生 ...

  5. Java迭代器模式

    迭代器模式是Java和.Net编程环境中非常常用的设计模式.此模式用于以顺序方式访问集合对象的元素,而不需要知道其底层表示. 迭代器模式属于行为模式类别. 实现实例 在这个实例中,将创建一个Itera ...

  6. Python3函数中特殊形参的使用:*、*args、**kwargs

    Python3函数中特殊形参的使用:*.*args.**kwargs ==用法1:不定长参数== 当函数需要的参数数量不确定的时候,可以使用*args 和 **kwargs , 所有的位置参数保存在* ...

  7. Python Challenge 关卡目录及解答过程

    第0关:http://www.pythonchallenge.com/pc/def/0.html 线索:试着改变URL的地址-->把图片中得到的数字输入到URL中 2**38 输出: 第1关:h ...

  8. spring cloud 使用Eureka作为服务注册中心

    什么是Eureka?  Eureka是在AWS上定位服务的REST服务. Eureka简单示例,仅作为学习参考 在pom文件引入相关的starter(起步依赖) /*定义使用的spring cloud ...

  9. Python的基础类型(int,bool,str):

    Python的基础类型(int,bool,str): 1.int -------> 整形:主要用力进行数字计算 2.string ------>字符串:可以保存少量数据并进行相关的操作 3 ...

  10. .net core mvc model填充过滤器

    在程序开发中,我们可能经常遇到所有的数据库表有相同的属性和行为,比如需要记录数据的创建人员,创建时间,修改时间和修改人.如果在每个action中都加上这些信息,代码看着比较冗余,看着不那么优雅,于是考 ...