2012-12-10 43 views
1

我使用了一個HadlerAttribute和一個ICallHandler的實例,從而實現了Unity攔截。爲了讓它工作,我所要做的就是用[Trace]屬性裝飾類,而攔截器的工作效果很好。使用自動佈線的統一攔截

[Trace] 
public interface IPersonService 
{ 
    string GetPerson(); 
} 

但是我想在兩個程序集中爲我的所有方法進行攔截工作。所以我使用Unity自動註冊成立我的容器如下: http://unity.codeplex.com/discussions/281022

我有一個UnityContainerExtension配置如下:除了當我試圖建立全球註冊按照這個帖子

private static IUnityContainer BuildUnityContainer() 
    { 
     var container = new UnityContainer(); 

     //container.AddNewExtension<UnityInterfaceInterceptionRegisterer>(); 

     container. 
      ConfigureAutoRegistration(). 
      ExcludeSystemAssemblies(). 
      LoadAssemblyFrom(typeof(PersonService).Assembly.Location). 
      Include(If.ImplementsITypeName, Then.Register()). 
      ApplyAutoRegistration(); 


     return container; 
    } 

偉大工程, ,其中MVC4Unity是我的DLL:

public class UnityInterfaceInterceptionRegisterer : UnityContainerExtension 
{ 
    protected override void Initialize() 
    { 
     base.Container.AddNewExtension<Interception>(); 

     base.Container.Configure<Interception>(). 
      AddPolicy("LoggingPolicy"). 
      AddMatchingRule<AssemblyMatchingRule> 
      (new InjectionConstructor("MVC4Unity")). 
      AddCallHandler(new TraceCallHandler()); 


     base.Context.Registering += new EventHandler<RegisterEventArgs>(this.OnRegister); 
    } 

    private void OnRegister(object sender, RegisterEventArgs e) 
    { 
     IUnityContainer container = sender as IUnityContainer; 

     if (e != null && e.TypeFrom != null && e.TypeFrom.IsInterface) 
     { 
      container.Configure<Interception>() 
       .SetInterceptorFor(e.TypeFrom, e.Name, new InterfaceInterceptor()); 
     } 
    } 
} 

不幸的是它總是拋出一個StackOverflowException當它進入OnRegister方法(!)。

接下來的問題是,有沒有人使用Unity實現了程序集甚至命名空間廣泛的攔截,並且這是要走的路嗎?

[編輯]

看來,不管我在下面的AddMatchingRule行添加,該OnRegister處理程序被調用的所有包括的組件以及! (例如,甚至微軟的。*命名空間程序集!)

base.Container.AddNewExtension<Interception>(); 

     base.Container.Configure<Interception>(). 
      AddPolicy("LoggingPolicy"). 
      // see what other types of matchings rules there are! 
      AddMatchingRule<NamespaceMatchingRule> 
      (new InjectionConstructor("MVC4Unity.*")). 
      AddCallHandler(new TraceCallHandler()); 


     base.Context.Registering += new EventHandler<RegisterEventArgs>(this.OnRegister); 

回答

1

我遲到了,我的答案可能會有人會覺得這很有用。

  • 如果我理解正確的問題,您需要一個匹配規則應用於多個組件。對於這些類型的任務,您可以使用AssemblyMatchingRuleMSDN)。

    container.Configure<Interception>() 
        .AddPolicy("logging") 
        .AddMatchingRule<AssemblyMatchingRule>(
        new InjectionConstructor(
        new InjectionParameter("YourAssemblyName"))) 
        .AddCallHandler<LoggingCallHandler>(
        new ContainerControlledLifetimeManager(), 
        new InjectionConstructor(), new InjectionProperty("Order", 1)); 
    
  • 在你最後的代碼片段,我認爲你需要刪除的點星號的命名空間的末端,以MVC4Unity命名空間添加到您的NamespaceMatchingRule


有關更多信息,請檢查此鏈接 - Policy Injection MSDN