王朝网络
分享
 
 
 

Unity Container 应用示例

王朝学院·作者佚名  2016-05-20  
宽屏版  字体: |||超大  

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*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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有