一 项目引用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 应用示例的更多相关文章

  1. Unity Container

    Unity Container中的几种注册方式与示例 2013-12-08 22:43 by 小白哥哥, 22 阅读, 0 评论, 收藏, 编辑 1.实例注册 最简单的注册方式就是实例注册,Unity ...

  2. 使用Unity Container

    Lab1.使用Unity Container Unity Container最主要的两个方法就是RegisterType和Resolve了,RegisterType用于注册类型的映射,而Resolve ...

  3. Unity Container中的几种注册方式与示例

    1.实例注册 最简单的注册方式就是实例注册,Unity 容器负责维护对一个类型的单例引用,比如: 有如下的实际类型: namespace ConsoleSample { public class Sa ...

  4. 微软IOC容器Unity简单代码示例3-基于约定的自动注册机制

    @(编程) [TOC] Unity在3.0之后,支持基于约定的自动注册机制Registration By Convention,本文简单介绍如何配置. 1. 通过Nuget下载Unity 版本号如下: ...

  5. 微软IOC容器Unity简单代码示例2-配置文件方式

    @(编程) 1. 通过Nuget下载Unity 这个就不介绍了 2. 接口代码 namespace UnityDemo { interface ILogIn { void Login(); } } n ...

  6. 微软IOC容器Unity简单代码示例1

    @(编程) 1. 通过Nuget下载Unity 这个就不介绍了 2. 接口代码 namespace UnityDemo { interface ILogIn { void Login(); } } 3 ...

  7. unity c# 代码示例

    1. using UnityEngine; using System.Collections; public class AnimatorMove : MonoBehaviour { public f ...

  8. Unity文档阅读 第三章 依赖注入与Unity

    Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...

  9. Unity容器中AOP应用示例程序

    转发请注明出处:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 实在没有找到Unity容器的AOP应用程序示例的说明,在微软官网找到了教程( ...

随机推荐

  1. C中嵌入python

    嵌入 与python的扩展相对,嵌入是把Python解释器包装到C的程序中.这样做可以给大型的,单一的,要求严格的,私有的并且(或者)极其重要的应用程序内嵌Python解释器的能力.一旦内嵌了Pyth ...

  2. False 等效值

    False 等效值 下面这些值将被计算出 false (also known as Falsy values): false undefined null 0 NaN 空字符串 ("&quo ...

  3. Oracle的AWR报告分析

    * 定义:awr报告是oracle 10g下提供的一种性能收集和分析工具,它能提供一个时间段内整个系统资源使用情况的报告,通过这个报告,我们就可以了解一个系统的整个运行情况,这就像一个人全面的体检报告 ...

  4. web前端基础——补充

    1  布局和事件 布局效果如下(标题和内容都居中,两边留空白) 布局代码如下 <!DOCTYPE html> <html lang="en"> <he ...

  5. 一道来自华为的C机试题目

    题目是这样的 求一个字符串中连续字母的个数 比如I have a book. : 1 I have a dog. : 0 I haavee aa dogg : 4 #include <windo ...

  6. wpf 模拟3D效果(和手机浏览图片效果相似)(附源码)

    原文 wpf 模拟3D效果(和手机浏览图片效果相似)(附源码) pf的3D是一个很有意思的东西,类似于ps的效果,类似于电影动画的效果,因为动画的效果,(对于3D基础的摄像机,光源,之类不介绍,对于依 ...

  7. Spring Tool Suite生成默认的MVC项目的配置文件问题

    1.STS是开发Spring程序的首选,基于JavaEE的程序,我都用STS来开发,但是在生成默认的MVC项目时,其配置文件让人很讨厌,在许多选项上都会加一个beans,如<beans:bean ...

  8. 高性能队列——Disruptor

    背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级).基于Disruptor开发的系统单线程能 ...

  9. C#File类常用文件操作以及一个模拟的控制台文件管理系统

    重温一下C#中File类的一些基本操作: File类,是一个静态类,主要是来提供一些函数库用的. 使用时需要引入System.IO命名空间. 一.常用操作: 1.创建文件方法 //参数1:要创建的文件 ...

  10. 开发app前需要提前准备的资料

    需要准备的资料整理如下: 1 域名未注册,建议在 阿里云注册:https://www.aliyun.com/,2 服务器https://ecs-buy.aliyun.com/配置:计费方式:包年包月地 ...