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

时间: 2024-10-12 20:55:22

Unity Container 应用示例的相关文章

Unity Surface Shader 示例分析

对于Unity中的表面着色器(Surface Shader),它的代码整体结构如下所示: Shader "name" { Properties { // 第一部分 } SubShader { // 第二部分 } Fallback "Diffuse" // 第三部分 } 第一部分 Properties 数据块 它的作用是充当数据的接口,将外部的数据(资源)引入进来,以供着色器内部使用.在这里,我们可以定义的数据类型如下所示: (1) _MainTex ( "

unity c# 代码示例

1. using UnityEngine; using System.Collections; public class AnimatorMove : MonoBehaviour { public float DirectionDampTime = .25f; private Animator animator; //声明一个动作机变量 animator void Start () { animator = GetComponent<Animator>(); } void Update ()

Unity容器中AOP应用示例程序

转发请注明出处:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 实在没有找到Unity容器的AOP应用程序示例的说明,在微软官网找到了教程(https://docs.microsoft.com/zh-cn/previous-versions/msp-n-p/dn507492(v%3dpandp.30))看的眼睛疼,而且说得也不是很详细.我自己根据一些资料做了个demo.关键代码: /// unity container 的AOP可以完成

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

概述 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题.构建一个成功应用程序的关键是实现非常松散的耦合设计.松散耦合的应用程序更灵活,更易于维护.这样的程序也更容易在开发期间进行测试.你可以模拟对象,具有较强的具体依赖关系的垫片(轻量级模拟实现),如数据库连接,网络连接,ERP连接,和丰富的用户界面组件.例如,处理客户信息的对象可能依赖于其他对象访问的数据存储,验证信息,并检查该用户是否被授权执行更

Unity IoC Container创建对象过程

Unity是微软P&P推出的一个开源的IoC框架,最新的官方版本是2.0.Unity之前的版本建立在一个称为ObjectBuild的组件上,熟悉EnterLib的读者,相信对ObjectBuild不会感到陌生.对于EnterLib 5.0之前的版本,ObjectBuild可以说是所有Application Block的基石.ObjectBuild提供一种扩展.可定制的对象创建方式,虽然微软官方没有将ObjectBuild和IoC联系在一起,其本质可以看成是一个IoC框架.在Unity 2.0中,

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

[狗刨学习网] Unity是微软P&P推出的一个开源的IoC框架,最新的官方版本是2.0.Unity之前的版本建立在一个称为ObjectBuild的组件上,熟悉EnterLib的读者,相信对ObjectBuild不会感到陌生.对于EnterLib 5.0之前的版本,ObjectBuild可以说是所有Application Block的基石.ObjectBuild提供一种扩展.可定制的对象创建方式,虽然微软官方没有将ObjectBuild和IoC联系在一起,其本质可以看成是一个IoC框架.在Uni

【ASP.Net MVC3 】使用Unity 实现依赖注入

什么是Unity? Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题.构建一个成功应用程序的关键是实现非常松散的耦合设计.松散耦合的应用程序更灵活,更易于维护.这样的程序也更容易在开发期间进行测试.你可以模拟对象,具有较强的具体依赖关系的垫片(轻量级模拟实现),如数据库连接,网络连接,ERP连接,和丰富的用户界面组件.例如,处理客户信息的对象可能依赖于其他对象访问的数据存储,验证信息,并检查该用户是

Unity轻量级依赖注入容器

一.前言 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.在Nuget里安装unity 二.Unity的API方法 UnityContainer.RegisterType<ITFrom,TTO>();  //注册映射 UnityContainer.RegisterType< ITFrom, TTO >("keyName");//注册映射指定key值 IEnumerable<T> databases = UnityCon

ASP.NET MVC IOC之Unity攻略

一.你知道IOC与DI吗? 1.IOC(Inversion of Control )——控制反转 即依赖对象不在被依赖模块的类中直接通过new来获取 先看看下面这段代码的问题~ public class SqlServerDal { public void Delete() { Console.WriteLine("删除表中某个订单信息!"); } } public class Order { private readonly SqlServerDal dal = new SqlSer