Unity 处理IOC AOP

用Unity 可以做IOC(控制反转) AOP(切面)可以做统一的异常和日志处理,非常方便,项目中是用微软企业库中的Microsoft.Practices.Unity实现

1 定义接口与实现

    //定义接口
    public interface IProductService
    {
        string GetProduct();
    }

    //实现接口
    public class ProductService:IProductService
    {
        public string GetProduct()
        {
            int i = 0;
            int j = 1;
            //抛异常
            return (j / i).ToString();
        }
    }

2 实现依赖反转

 public sealed class ServiceLocator : IServiceProvider
    {
        #region Private Fields
        private readonly IUnityContainer container;
        #endregion

        #region Private Static Fields
        private static readonly ServiceLocator instance = new ServiceLocator();
        #endregion

        #region Ctor
        /// <summary>
        /// Initializes a new instance of <c>ServiceLocator</c> class.
        /// </summary>
        private ServiceLocator()
        {
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            container = new UnityContainer();
            section.Configure(container);
        }
        #endregion

        #region Public Static Properties
        /// <summary>
        /// Gets the singleton instance of the <c>ServiceLocator</c> class.
        /// </summary>
        public static ServiceLocator Instance
        {
            get { return instance; }
        }
        #endregion

        #region Private Methods
        private IEnumerable<ParameterOverride> GetParameterOverrides(object overridedArguments)
        {
            List<ParameterOverride> overrides = new List<ParameterOverride>();
            Type argumentsType = overridedArguments.GetType();
            argumentsType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .ToList()
                .ForEach(property =>
                {
                    var propertyValue = property.GetValue(overridedArguments, null);
                    var propertyName = property.Name;
                    overrides.Add(new ParameterOverride(propertyName, propertyValue));
                });
            return overrides;
        }
        #endregion

        #region Public Methods
        /// <summary>
        /// Gets the service instance with the given type.
        /// </summary>
        /// <typeparam name="T">The type of the service.</typeparam>
        /// <returns>The service instance.</returns>
        public T GetService<T>()
        {
            return container.Resolve<T>();
        }
        /// <summary>
        /// Gets the service instance with the given type by using the overrided arguments.
        /// </summary>
        /// <typeparam name="T">The type of the service.</typeparam>
        /// <param name="overridedArguments">The overrided arguments.</param>
        /// <returns>The service instance.</returns>
        public T GetService<T>(object overridedArguments)
        {
            var overrides = GetParameterOverrides(overridedArguments);
            return container.Resolve<T>(overrides.ToArray());
        }
        /// <summary>
        /// Gets the service instance with the given type by using the overrided arguments.
        /// </summary>
        /// <param name="serviceType">The type of the service.</param>
        /// <param name="overridedArguments">The overrided arguments.</param>
        /// <returns>The service instance.</returns>
        public object GetService(Type serviceType, object overridedArguments)
        {
            var overrides = GetParameterOverrides(overridedArguments);
            return container.Resolve(serviceType, overrides.ToArray());
        }
        #endregion

        #region IServiceProvider Members
        /// <summary>
        /// Gets the service instance with the given type.
        /// </summary>
        /// <param name="serviceType">The type of the service.</param>
        /// <returns>The service instance.</returns>
        public object GetService(Type serviceType)
        {
            return container.Resolve(serviceType);
        }

        #endregion
    }

3 异常拦截类

public class ExceptionLoggingBehavior: IInterceptionBehavior
    {
        public IEnumerable<Type> GetRequiredInterfaces()
        {
            return Type.EmptyTypes;
        }

        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
            var methodReturn = getNext().Invoke(input, getNext);
            if (methodReturn.Exception != null)
            {
                Console.WriteLine("拦截到异常 " + methodReturn.Exception.Message);
            }

            return methodReturn;
        }

        public bool WillExecute
        {
            get { return true; }
        }

    }

4 App.config 配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
  <!--BEGIN: Unity-->
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration"/>
    <container>
      <extension type="Interception"/>
      <!--Cache Provider-->
      <register type="UnityAOP.IProductService, UnityAOP" mapTo="UnityAOP.ProductService, UnityAOP">
        <interceptor type="InterfaceInterceptor"/>
        <!--<interceptionBehavior type="UnityAOP.CachingBehavior, UnityAOP"/>-->
        <interceptionBehavior type="UnityAOP.ExceptionLoggingBehavior, UnityAOP"/>
      </register>
    </container>
  </unity>
  <!--END: Unity-->
</configuration>

5 调用

static void Main(string[] args)
        {
            IProductService service =  ServiceLocator.Instance.GetService<IProductService>();
            try
            {
                service.GetProduct();
            }
            catch (Exception ex)
            {

            }

            Console.Read();
        }

简单的例子

代码:http://files.cnblogs.com/files/zery/UnityAOP.rar

时间: 2024-10-12 23:36:45

Unity 处理IOC AOP的相关文章

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可以完成

spring的优点 ioc aop

spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.spring的DI机制降低了业务对象替换的复

spring ioc aop 原理

spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调用者需要被调用者的协助时,通常由调用者来创建被调用者的实例.但在spring里创建被调用者的工作不再由调用者来完成,因此控制反转(IoC):创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也被称为依赖注入(DI),依赖注入和控制反转是同一个概念. 面向方面编程(AOP)是以另

IOC AOP 设计模式

IOC AOP 不是什么技术而是一种设计模式  学习 IOC AOP 其实是在学习一种思想. 1.IOC IOC其实是 将对象的创建和获取提取到外部.由外部IOC容器提供需要的组件. 看下面代码: public class Girl { //外部包办直接传入boy类 public void kiss3(Boy boy) { Console.WriteLine("girl kiss boy"); boy.kiss(); } } public class Boy { public void

spring ioc aop 的原理

IOC(反转控制):对成员变量的赋值的控制权从代码中反转到配置文件中.AOP:Aspect(切面) Oriented(面向) Programming(编程),面向切面编程.差不多就够了,再看就是Spring的事务处理,基本就这些.

Spring初探(IOC,AOP,DI)

Spring的引出: 问题1:依赖配置信息... class UserDaoImpl implements UserDao { //数据库连接信息,需要一些配置,但是又不能写在这个类中(硬编码,改的时候麻烦) private String jdbcUrl = "..."; private String driverClass; private String username; private String password; // ... } 把这些配置信息放在外部的一个配置文件中:

spring Ioc Aop整合

之前用DWP项目做spring的IOC,xml总是提示有问题,之后改用maven通过. 之后将这一块的内容补充. 仔细考虑一下spring 的IOC是无处不在的,演示Aop也需要依赖spring的IOC. spring Aop例子. 本文例子在http://www.blogjava.net/javadragon/archive/2006/12/03/85115.html基础上进行些许修改,首先项目结构图: 其次运行结果图: 最开始的pom文件(property与dependency可以复制) <

IOC.AOP

ioc就是控制翻转或是依赖注入.通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过spring的bean工厂为你长生这样一个对象.aop就是面向切面的编程.比如说你每做一次对数据库操作,都要生成一句日志.如果,你对数据库的操作有很多类,那你每一类中都要写关于日志的方法.但是如果你用aop,那么你可以写一个方法在这个方法中有关于数据库操作的方法,每一次调用这个方法的时候,就加上生成日志的操作. IOC(反转控制):对成员变量的赋值的控制权从代码中反转到配置文

Castle.Windsor IOC/AOP的使用

Castle最早在2003年诞生于Apache Avalon项目,目的是为了创建一个IOC(控制反转)框架.发展到现在已经有4个组件了,分别是ActiveRecord(ORM组件).Windsor(IOC组件).DynamicProxy(动态代理组件).MonoRail(Web MVC组件). 这里我们要学习的是Windsor组件,Windsor是Castle提供的一个IOC框架. 使用之前,首先需要引用两个DLL,分别是:Castle.Core 和 Castle.Windsor. IOC(控制