容器初始化后配置统一拦截

时间:2011-04-05 07:16:37

标签: c# asp.net-mvc-3 unity-container interception

我有一个通过XML文件配置的统一容器。在配置之后,我想通过代码向某些类型添加一些拦截。如何才能做到这一点?我有以下行为:

using System;
using System.Collections.Generic;
using System.Web.Mvc;
using Microsoft.Practices.Unity.InterceptionExtension;
using NLog;

namespace WebDibaelsaMVC.Utils.Behaviors
{
    public class LoggingBehavior : IInterceptionBehavior
    {
        private readonly Logger _log = LogManager.GetLogger("Unity");

        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
            var msg = getNext()(input, getNext);
            if (msg.Exception != null)
                _log.ErrorException("Error d'unity.", msg.Exception);
            return msg;
        }

        public IEnumerable<Type> GetRequiredInterfaces()
        {
            return new[] {typeof (IController)};
        }

        public bool WillExecute
        {
            get
            {
                return true;
            }
        }
    }
}

我希望所有调用通过容器解析的类型的IController方法都能通过这种行为。我该怎么办?

1 个答案:

答案 0 :(得分:4)

在加载配置后,只需调用配置API即可。 “配置时间”没有什么神奇之处; Unity的规则是“最后配置获胜”。因此,您可以从XML加载,使用API​​执行操作,并加载第二个XML部分,它们将全部加载到一起。

如果您正在使用MVC进行拦截,请注意使其正常工作的唯一方法是使用VirtualMethodInterceptor;使用实例拦截器还需要一个自定义动作调用器才能使一切正常工作(相信我,我已经尝试过了)。