2

Pour configurer l'interception dans Unity 2.0 vous mettez quelque chose comme ça dans votre config (extrait de la documentation Unity) ...Configuration d'interception d'unité - comment rendre moins verbeux?

 <policy name="addDataAccessTypes"> 
     <matchingRule name="DataLayerMatch" type="NamespaceMatchingRule"> 
      <constructor> 
      <param name="namespaceName" value="MyApp.DataAccess" /> 
      </constructor> 
     </matchingRule> 
     <callHandler name="LogHandler" type="LoggingCallHandler" /> 
     <callHandler name="SecurityHandler" 
      type="DatabaseSecurityCheckHandler" /> 
     </policy> 

Est-il possible de configurer plusieurs interfaces pour inteception avec la même classe de manutention?

E.g. quelque chose comme ça ...

<constructor> 
    < interface to intercept 1 /> 
    < interface to intercept 2 /> 
</construtor> 

Avec la méthode donnée dans l'exemple de l'unité de votre fichier de configuration devient très bavard si vous avez beaucoup d'interfaces pour intercepter.

Répondre

2

Vous pouvez effectuer des interceptions avec des attributs de manière plus fluide si vous utilisez l'assemblage Unity.Interception. L'inconvénient est la classe interceptées fait (en quelque sorte) savoir sur l'aspect:

Un exemple très rapide de la configuration ressemble à ceci:

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Console.WriteLine(); 
      Console.WriteLine("Starting test..."); 

      var container = new UnityContainer(); 
      container.AddNewExtension<Interception>(); 
      container.Configure<Interception>() 
       .SetDefaultInterceptorFor<IGadget>(new InterfaceInterceptor()); 

      container.RegisterType<IGadget, Gadget>(); 

      var gadget = container.Resolve<IGadget>(); 
      gadget.DoSomething(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(); 
      Console.WriteLine("An error has occurred: {0}", ex); 
     } 
     finally 
     { 
      Console.WriteLine(); 
      Console.WriteLine("Test complete."); 
      Console.ReadKey(); 
     } 
    } 
} 



public class LogAttribute : HandlerAttribute 
{ 
    public override ICallHandler CreateHandler(IUnityContainer container) 
    { 
     return container.Resolve<LogHandler>(); 
    } 
} 

public class LogHandler : ICallHandler 
{ 
    public int Order { get; set; } 

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     Console.WriteLine("*** Logging the action! -{0}-", input.MethodBase.Name); 
     return getNext()(input, getNext); 
    } 
} 

public interface IGadget 
{ 
    void DoSomething(); 
} 

[Log] 
public class Gadget : IGadget 
{ 
    public void DoSomething() 
    { 
     Console.WriteLine("\tI did something!"); 
    } 
} 
+0

Bonne idée, mais ont besoin de le faire dans la configuration. – Remotec

+0

Je ne suis pas sûr de ce que vous dites. Voulez-vous dire que vous êtes limité à le faire dans la config pour une raison quelconque? J'offrais ma solution comme une alternative à avoir à faire des configurations dans le fichier de configuration. – cloggins

Questions connexes