2011-04-05 79 views
2

我有一个通过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方法的所有呼叫都通过容器解决,通过这种行为。我该怎么做?

回答

4

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

如果您在MVC中使用拦截,请注意确保正确工作的唯一方法是使用VirtualMethodInterceptor;使用一个实例拦截器还需要一个自定义动作调用器来让所有的东西都正常工作(相信我,我已经尝试过了)。

+0

但是,我可以添加行为到已经注册的组件吗?我只找到了在注册时间添加行为的方法... – 2011-04-07 06:01:29

+1

当然,只需调用container.RegisterType (new InterceptionBehavior(...));再次。它增加了现有的注册,而不是覆盖它。 – 2011-04-08 00:18:49

+0

太棒了!谢谢!我认为它再次注册了类型。 – 2011-04-08 05:56:17