2017-06-10 2 views
0

Je pense qu'il n'y a qu'un événement Registered dans l'interface tel que mis en œuvre. Ce que je demandais: Est-il possible d'intercepter chaque enregistrement tout en enregistrant le temps d'ajouter des fonctionnalités supplémentaires. Comme événement Registering?Enregistrement d'événement dans Autofac

Par exemple, j'ai une interface IApplicationService. Ceci est une interface de marqueur pour enregistrer tous ApplicationServices comme le moyen conventionnel. Cette interface me permettra d'enregistrer tous les ApplicationServices dans ma couche qui a conçu avec l'approche DDD. Donc, je veux appliquer UnitOfWorkpar défaut à tous lesApplicationServices sur Inscription temps en les intercepter et de les décorer un UnitOfWorkInterceptor. Cette approche conduit à cela, j'ai besoin d'un événement Registering pour appliquer toutes les méthodes As<> ou InterceptedBy<> à l'enregistrement d'un composant en tant qu'additif.

Cela signifie que mettre à jour un composant lors de l'enregistrement, je suppose. Comment puis-je traiter mes inscriptions avec cette approche?

Répondre

0

Vous pouvez mettre en place un module Autofac qui a une méthode AttachToComponentRegistration qui sera déclenchée pour chaque enregistrement

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

la AttachToComponentRegistration sera déclenchée pour chaque enregistrement: passé et futur. L'extension Autofac.Extras.DynamicProxy2 fonctionne avec RegistrationBuilder tandis que Module fonctionne avec Registration. AFAIK il n'y a aucun moyen d'intercepter IRegistrationBuilder et d'appeler automatiquement des méthodes sur elle, donc il n'y a pas moyen facile d'utiliser la méthode InterceptedBy et ainsi de suite sur un Module.

Vous pouvez par la façon dont le faire en utilisant l'interception de Castle.Core classique sans compter sur Autofac.Extras.DynamicProxy2 avec quelque chose comme ceci:

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); 
    } 
} 

Vous pouvez parcourir les source code du module Autofac.Extras.DynamicProxy2 de comprendre comment vous pouvez intégrer Castle .Core avec Autofac.

+0

Comment puis-je appliquer 'InterceptedBy <>' avec cette approche au composant existant sans le surcharger? –

+0

@OguzhanSoykan J'ai édité mon post pour inclure plus d'échantillon –

+0

merci pour votre réponse. Je prévoyais que cette réponse viendrait :) J'ai déjà mis en œuvre cette approche et aussi vous avez dit ce que je me demandais * il n'y a aucun moyen d'intercepter IRegistrationBuilder *. Donc, je vais marquer votre solution comme réponse mais, je pense que nous devons intercepter * IRegistrationBuilder * finalement ... –