2017-06-10 21 views
0

IComponentRegistryインターフェイスにはRegisteredイベントしか実装されていないと思います。私が思っていたこと:追加の機能を追加する時間を登録しながら、すべての登録を傍受する方法はありますか?などRegisteringイベント?Autofacでイベントを登録する

例えば、私はIApplicationServiceというインターフェースを持っています。これは、すべて従来の方法としてApplicationServicesを登録するマーカーインターフェイスです。このインターフェイスは私がDDDのアプローチで設計したすべてのレイヤーにApplicationServicesを登録することを可能にします。だから、私はそれらをインターセプトし、それらにUnitOfWorkInterceptorを飾ることで登録時間上のすべてのApplicationServicesにデフォルトとしてたUnitOfWorkを適用したいです。この方法では、の方法を適用するために、Registeringイベントが必要となります。

これは、登録時にコンポーネントを更新することを意味します。どのように私はそのアプローチで私の登録を扱うことができますか?過去と未来:

答えて

0

は、あなたはすべての登録のためにトリガされますすべての登録

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

AttachToComponentRegistrationのためにトリガされますAttachToComponentRegistration方法がありAutofacモジュールを実装することができます。

Autofac.Extras.DynamicProxy2拡張子はRegistrationBuilderで、ModuleRegistrationとなります。 AFAIKでは、 IRegistrationBuilderを傍受して自動的にメソッドを呼び出す方法がないため、InterceptedByなどのメソッドをModuleで簡単に使用する方法はありません。あなたが途中でこのようなものでAutofac.Extras.DynamicProxy2に頼ることなく、古典的なCastle.Coreの傍受を使用してそれを行うことができます

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を閲覧することができますが、あなたが城を統合することができる方法を理解します.CoreAutofac

+0

これを上書きせずに既存のコンポーネントにこの承認を 'InterceptedBy <>'どのように適用できますか? –

+0

@OguzhanSoykan私は多くのサンプルを含めるために投稿を編集しました –

+0

あなたの答えに感謝します。私はこの答えが来るだろうと予測していました。私はすでにこのアプローチを実装していて、IRegistrationBuilder *を傍受する方法がないと思っていたことをあなたは話しました。だから、私はあなたの解決策を答えにするつもりですが、最終的にIRegistrationBuilder *を傍受する必要があると思います。 –

関連する問題