Unity Container 应用示例
一 项目引用Unity
右键项目引用-> 管理Nuget包->搜索unity->安装Unity 和 Unity Interception Extension,如下图所示.

二 创建基础类
我们以商品查询的数据层注入为例.
1.首先创建商品实体Model. 如果商品信息要被序列化,就要为该类添加Serializable特性.
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int Price { get; set; } public override string ToString()
{
return string.Format(" Product id:{0}\r\n Name:{1}\r\n Price:{2}\r\n",Id,Name,Price);
}
}
2.创建数据层接口及其实现类.
public interface IProductDao
{
Product Get(int id);
}
public class ProductDao:IProductDao
{
public Product Get(int id)
{
#warning product info for test
return new Product()
{
Id = id,
Name = "Product"+id,
Price = id*
};
}
}
3.直接创建实例
其实有了以上内容就可以调用查询商品信息了.
static void Main( string[] args)
{
IProductDao productDao= new ProductDao();
Product product = productDao.Get();
Console.WriteLine(product.ToString());
Console.Read();
}

不过在项目中使用这种方式的话,耦合度比较高.一旦想修改IProductDao的实现方式涉及到的地方就太多了. 使用Unity实现依赖注入可以降低耦合.
三.使用Unity实现依赖注入
1.创建Unity配置文件
<? xml version= "1.0 "?>
< configuration>
< configSections>
<!-- unity程序集-->
< section name= "unity " type =" Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</ configSections>
< unity xmlns= "http://schemas.microsoft.com/practices/2010/unity ">
<!-- 程序集和命名空间 -->
< assembly name= "DemoCache "/>
< namespace name= "DemoCache.Dao "/>
< namespace name= "DemoCache.Dao.Impl "/>
< container name= "Dao ">
<!-- 商品 -->
< register type= "IProductDao " mapTo= "ProductDao "></ register>
</ container>
</ unity>
</ configuration>
2.创建UnityContainerManager类
创建UnityContainerManager读取Unity.config配置. 完整代码见附件,重点看一下从Unity.config读取配置信息的方法:
private IUnityContainer LoadUnityConfig()
{
////根据文件名获取指定config文件
string filePath = AppDomain.CurrentDomain.BaseDirectory + @"Configs\Unity.config";
var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = filePath }; //从config文件中读取配置信息
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");
var container = new UnityContainer();
foreach (var item in unitySection.Containers)
{
container.LoadConfiguration(unitySection, item.Name);
} return container;
}
3.调用示例
static void Main( string[] args)
{
IProductDao productDao = UnityContainerManager .Instance.Resolve<IProductDao >();
Product product = productDao.Get();
Console.WriteLine(product.ToString());
Console.Read();
}
四 使用Unity Interception实现日志
1.创建ICallHandler接口实现类
新建类LogCallHandler类,实现接口ICallHandler. 每次调用相应方法时会自动将执行时间写入日志.
public class LogCallHandler:ICallHandler
{
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
//计时开始
var stopWatch = new Stopwatch();
stopWatch.Start(); //执行方法
IMethodReturn result = getNext()(input, getNext); //计时结束
stopWatch.Stop(); //记录日志 var argumentsSb = new StringBuilder(input.MethodBase.Name);
for (var i = ; i < input.Arguments.Count; i++)
{
argumentsSb.AppendFormat("-{0}:{1}", input.Arguments.ParameterName(i), input.Arguments[i]);
}
LogHelper.LogInfo(string.Format("{2} 方法 {0},执行时间 {1} ms", argumentsSb, stopWatch.ElapsedMilliseconds,Msg));
return result;
} public int Order { get; set; }
public string Msg { get; set; }
}
2.创建特性
创建特性LogTime,它需要实现HandlerAttribute.
public class LogTimeAttributes:HandlerAttribute
{
public int Order { get; set; }
public string Msg { get; set; }
public override ICallHandler CreateHandler(IUnityContainer container)
{
return new LogCallHandler()
{
Order = Order,
Msg = Msg
};
}
}
3.使用特性
[LogTimeAttributes (Order = ,Msg = "查询单个商品信息" )]
4.配置Unity.config
配置Unity Interception需要在unity节点下添加:
< sectionExtension
type =" Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,Microsoft.Practices.Unity.Interception.Configuration ">
</ sectionExtension >
然后在container节点下添加:
< extension type= "Interception " />
最后调整IProductDao的注册节点:
< register type= "IProductDao " mapTo= "ProductDao ">
< interceptor type =" InterfaceInterceptor" />
< policyInjection />
</ register>
调用处不用做调整,结果如下:

5.不使用Unity.config配置文件
其实如果不走Unity.config配置文件,也可以直接在代码中设置.
static void Main(string[] args)
{
var container = new UnityContainer().AddNewExtension<Interception>().RegisterType<IProductDao, ProductDao>();
container.Configure<Interception>().SetInterceptorFor<IProductDao>(new InterfaceInterceptor());
IProductDao productDao = container.Resolve<IProductDao>();
Product product = productDao.Get();
Console.WriteLine(product);
Console.Read();
}
代码: http://files.cnblogs.com/files/janes/DemoCache.zip
Unity Container 应用示例的更多相关文章
- Unity Container
Unity Container中的几种注册方式与示例 2013-12-08 22:43 by 小白哥哥, 22 阅读, 0 评论, 收藏, 编辑 1.实例注册 最简单的注册方式就是实例注册,Unity ...
- 使用Unity Container
Lab1.使用Unity Container Unity Container最主要的两个方法就是RegisterType和Resolve了,RegisterType用于注册类型的映射,而Resolve ...
- Unity Container中的几种注册方式与示例
1.实例注册 最简单的注册方式就是实例注册,Unity 容器负责维护对一个类型的单例引用,比如: 有如下的实际类型: namespace ConsoleSample { public class Sa ...
- 微软IOC容器Unity简单代码示例3-基于约定的自动注册机制
@(编程) [TOC] Unity在3.0之后,支持基于约定的自动注册机制Registration By Convention,本文简单介绍如何配置. 1. 通过Nuget下载Unity 版本号如下: ...
- 微软IOC容器Unity简单代码示例2-配置文件方式
@(编程) 1. 通过Nuget下载Unity 这个就不介绍了 2. 接口代码 namespace UnityDemo { interface ILogIn { void Login(); } } n ...
- 微软IOC容器Unity简单代码示例1
@(编程) 1. 通过Nuget下载Unity 这个就不介绍了 2. 接口代码 namespace UnityDemo { interface ILogIn { void Login(); } } 3 ...
- unity c# 代码示例
1. using UnityEngine; using System.Collections; public class AnimatorMove : MonoBehaviour { public f ...
- Unity文档阅读 第三章 依赖注入与Unity
Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...
- Unity容器中AOP应用示例程序
转发请注明出处:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 实在没有找到Unity容器的AOP应用程序示例的说明,在微软官网找到了教程( ...
随机推荐
- LeetCode:455. Assign Cookies
package Others; import java.util.Arrays; //Question 455. Assign Cookies /* Assume you are an awesome ...
- NOIP 2014 Day2 T1 无线网络发射器
#include<iostream> #include<cmath> #include<cstdlib> #include<cstdio> #inclu ...
- SpringMVC框架下的异常处理
在eclipse的javaEE环境下:导包.... 1. 在 @ExceptionHandler 方法的入参中可以加入 Exception 类型的参数, 该参数即对应发生的异常对象 2. @Excep ...
- [java报错]Could not instantiate listener XXXXXX
写在开头的话: 兜兜转转,辞去了深圳的工作,回到了武汉,从事的居然一度是我最不想学的语言-java,曾经以为自己并不会java,但是上手之后,发现语言都是相通的,自己一度排斥学习java真的是不能再傻 ...
- 关于AJAX 的交互模型、交互流程及代码示范
AJAX = 异步JavaScript + XML. 它是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况 ...
- 关于ř与画面的集成---- k均值聚类
1.利用R内置数据集iris: 2.通过Rserve 包连接tableau,服务器:localhost,默认端口6311: 3.加载数据集iris: 4.编辑字段:Cluster <span s ...
- servlet上传下载(任何格式的都可以)
jar不能低于此版本,JDK1.6以上,否则户报错 <dependency> <groupId>commons-fileupload</groupId> <a ...
- 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样...
出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中增加了42种非常强大的调试助手 ...
- 【leetcode❤python】 204. Count Primes
#-*- coding: UTF-8 -*- #Hint1:#数字i,i的倍数一定不是质数,因此去掉i的倍数,例如5,5*1,5*2,5*3,5*4,5*5都不是质数,应该去掉#5*1,5*2,5*3 ...
- 图说函数模板右值引用参数(T&&)类型推导规则(C++11)
见下图: 规律总结: 只要我们传递一个基本类型是A④的左值,那么,传递后,T的类型就是A&,形参在函数体中的类型就是A&. 只要我们传递一个基本类型是A的右值,那么,传递后,T的类型就 ...
