2011-04-05 78 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