一 项目引用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 testreturn new Product(){Id = id,Name = "Product"+id,Price = id*10};}}

3.直接创建实例

其实有了以上内容就可以调用查询商品信息了.

static void Main( string[] args) { IProductDao productDao= new ProductDao(); Product product = productDao.Get(5); 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(8);
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 = 0; 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 = 1,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(8);Console.WriteLine(product);Console.Read();}

代码: http://files.cnblogs.com/files/janes/DemoCache.zip

Unity Container 应用示例相关推荐

  1. Shader学习笔记(七)Unity Shader Rim示例

    轮廓高光效果 Unity官方高光示例 Shader "Example/Rim" {Properties {_MainTex ("Texture", 2D) = ...

  2. Unity Render Feature示例

    参考教程:Scriptable Render Feature Unity 版本:2019.4 搭建URP场景 Render Feature作用是支持SRP扩展自定义渲染pass,因此需要在SRP下使用 ...

  3. union在c语言中的作用,c语言联合union的使用用途

    在使用联合的使用,我们通常用来判断大小端,但是其实不仅仅有这个用处. 我在网上看到还有其他的用途: 1.分离高低字节 这个需要结合cpu大小端来判断,原文如下: 这样的操作,而一个除法消耗四个机器周期 ...

  4. Unity Application Block-配置文件的使用-示例(附×××)

    Unity Application Block-配置文件的使用-示例(附×××) 关于在ASP.NET 中使用Unity Application Block的简单示例,请访问在ASP.NET 中使用 ...

  5. 你知道Unity IoC Container是如何创建对象的吗?

    Unity是微软P&P推出的一个开源的IoC框架,最新的官方版本是2.0.Unity之前的版本建立在一个称为ObjectBuild的组件上,熟悉EnterLib的读者,相信对ObjectBui ...

  6. C# 对轻量级(IoC Container)依赖注入Unity的使用

    概述 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题.构建一个成功应用程序的关键是实现非常松散的耦合 ...

  7. [cesium] 数字孪生 | 超图 | UE4 | Unity | 基于三维GIS + 游戏引擎结合示例 | UE4 和 Unity的效果展示

    说明 因为公司的产品规划,最近在研究数字孪生方向的产品,看到51word的云渲染路线三维GIS+游戏引擎跨界融合: 不过没多久看到超图官网已经出了相应的拓展插件今天准备试试.之前有关注过cesium有 ...

  8. Unity加载配置文件的两种方式

    1.当前AppDomain的配置文件(App.config或Web.config,通过AppDomain.CurrentDomain.SetupInformation.ConfigurationFil ...

  9. Unity的Flutter——UIWidgets简介及入门

    介绍 UIWidgets(https://github.com/UnityTech/UIWidgets)是Unity编辑器的一个插件包,可帮助开发人员通过Unity引擎来创建.调试和部署高效的跨平台应 ...

  10. Unity 开发和配置

    概述 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题.构建一个成功应用程序的关键是实现非常松散的耦合 ...

最新文章

  1. 学习笔记Hive(一)—— Hive简介
  2. Spring 原理初探——IoC、AOP
  3. Zuul路由的strip-prefix与order
  4. mysql out_mysql存储过程 in out inout
  5. matlab 查看dll的函数参数类型,MATLAB调用dll文件中的库函数时的变量类型匹配问题?...
  6. java 获取web目录结构_Intellij Idea Javaweb 目录结构及获取项目内资源
  7. 普通的PHP上传到云函数,php封装上传函数代码示例
  8. 闲来无事,仿了一个百度杀毒主界面
  9. 图像处理——DCT变换的学习笔记
  10. 闲话WPF之六(XAML的标记兼容性(Markup Compaibility))
  11. 易华录数据湖事业部安全中心招聘中高级安全工程师2-4人
  12. mysql gtid 还是pxc_PXC中的GTIDs
  13. Spring核心技术
  14. 最多50名同学的学号,姓名,及三科成绩,计算每位同学的平均成绩,并找出平均分的最高分和最低分
  15. IntelliJ IDEA在Mac下格式化代码快捷键与失效原因
  16. 制造业原材料价格上涨 安防设备涨还是不涨?
  17. 深入探究linux_深入探究GraphQL查询
  18. yolov3中的route和shortcut层
  19. android 模拟器 blue,Win下的Android模拟器BlueStacks
  20. [C++]打开新世界的大门之C++入门

热门文章

  1. dz搬家 win linux,Discuz论坛完美搬家 详细分享我的DZ搬家步骤
  2. 波士顿房价预测(深度学习)与找到影响房价的决定性因素(最速下降法)
  3. html横菜单中菜单均匀分布,html – 如何在flexbox中的行间均匀分布元素?
  4. PS RGB通道抠图方法
  5. 计蒜客T1006对齐输出
  6. 各国(地区)货币名称缩写表
  7. Verilog实现数字时钟
  8. Redis 的key设计技巧缓存问题
  9. 解决 ”To prevent a memory leak, the JDBC Driver has been forcibly unregistered“
  10. svn如何提取文件更新列表