2017-06-10 283 views
0

我認爲在IComponentRegistry接口中只有Registered事件實現。我想知道的是什麼:有沒有什麼方法可以在註冊時添加附加功能的同時攔截每個註冊。Registering事件?在Autofac中註冊事件

例如,我有一個接口IApplicationService。這是一個標記界面,將所有ApplicationServices註冊爲常規方式。這個界面將允許我在我的DDD方法設計的層中註冊所有ApplicationServices。所以,我想通過攔截他們,他們裝修的UnitOfWorkInterceptor的UnitOfWork爲默認適用於所有ApplicationServices註冊時間。這種方法導致我需要一個Registering事件來應用任何As<>InterceptedBy<>方法來註冊組件作爲附錄。

這意味着更新組件的註冊時間,我想。我怎樣才能用這種方式來對待我的註冊?

回答

0

你可以實現一個Autofac模塊具有AttachToComponentRegistration方法,這將觸發針對每個註冊

public class XModule : Module 
{ 
    protected override void AttachToComponentRegistration(
     IComponentRegistry componentRegistry, IComponentRegistration registration) 
    { 
     // do whatever you want with registration 
    } 
} 

AttachToComponentRegistration將觸發針對每個註冊:過去和未來。

Autofac.Extras.DynamicProxy2擴展與RegistrationBuilder一起使用,而ModuleRegistration一起使用。 AFAIK沒有辦法攔截 IRegistrationBuilder並自動調用它的方法,因此沒有簡單的方法使用InterceptedBy等方法在Module上。

您可以順便做用經典Castle.Core攔截,而不依賴於Autofac.Extras.DynamicProxy2像這樣的東西:

public class XModule : Module 
{ 
    public XModule() 
    { 
     this._generator = new ProxyGenerator(); 
    } 

    private readonly ProxyGenerator _generator; 

    protected override void AttachToComponentRegistration(
     IComponentRegistry componentRegistry, 
     IComponentRegistration registration) 
    { 
     if (registration.Services 
         .OfType<IServiceWithType>() 
         .Any(s => s.ServiceType == typeof(IApplicationService))) 
     { 
      registration.Activating += Registration_Activating; 
     } 
    } 

    private void Registration_Activating(Object sender, ActivatingEventArgs<Object> e) 
    { 
     Object proxy = this._generator.CreateClassProxyWithTarget(
      e.Instance.GetType(), 
      e.Instance, 
      e.Context.Resolve<IEnumerable<IInterceptor>>().ToArray()); 

     e.ReplaceInstance(proxy); 
    } 
} 

可以瀏覽Autofac.Extras.DynamicProxy2模塊的source code瞭解您如何整合城堡。核心Autofac

+0

我如何應用'InterceptedBy <>'將此批准應用到現有組件而不會覆蓋它? –

+0

@OguzhanSoykan我編輯我的帖子,包括更多樣本 –

+0

謝謝你的回答。我預測這個答案會出現:)我已經實施了這種方法,並且你告訴我在想什麼*沒有辦法攔截IRegistrationBuilder *。所以,我會將你的解決方案標記爲答案,但是,我認爲我們最終需要攔截* IRegistrationBuilder * –