2013-03-19 14 views
5

Mam NinjectWebCommon w następujący sposób. Nie mogę uzyskać wyzwalacza TimingInterceptor dla metody z ustawionym atrybutem "Timing". Działa to dobrze, jeśli pośrednik jest zdefiniowany na poziomie klasy, gdzie wszystkie wywołania metod zostaną przechwycone, ale chciałbym mieć możliwość określenia metody, którą chcę przechwycić (opt-in).Jak używać interpunkcji Ninject za pomocą InterceptAttribute

Mam Ninject.Extensions.Interception.DynamicProxy dodane.

public static class NinjectWebCommon 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    /// <summary> 
    /// Starts the application 
    /// </summary> 
    public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
     DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    /// <summary> 
    /// Stops the application. 
    /// </summary> 
    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 

    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var NinjectSettings = new NinjectSettings(); 
     var kernel = new StandardKernel(NinjectSettings); 

     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

     GlobalConfiguration.Configuration.DependencyResolver = new BazingaNinjectResolver(kernel); 

     RegisterServices(kernel); 
     return kernel; 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IMyService>().To<MyService>().InRequestScope(); 
    }   
} 

moja klasa usługi zdefiniować jak postępować

public class MyService : IMyService 
{ 
    Logger log; 

    public MyService() 
    { 
     log = LogManager.GetLogger(this.GetType().FullName); 
    } 

    [Timing] 
    public string GetString() 
    { 
     log.Info("log me!!"); 
     return "Cool string !!!!"; 
    } 

    public string GetUnInterceptString() 
    { 
     return "Not intercepted"; 
    } 
} 

Interceptor i przypisują zdefiniować następująco

public class TimingAttribute : InterceptAttribute 
{ 
    public override IInterceptor CreateInterceptor(IProxyRequest request) 
    { 
     return request.Context.Kernel.Get<TimingInterceptor>(); 
    } 
} 

public class TimingInterceptor : SimpleInterceptor 
{ 
    readonly Stopwatch _stopwatch = new Stopwatch(); 

    protected override void BeforeInvoke(IInvocation invocation) 
    { 
     _stopwatch.Start(); 
    } 

    protected override void AfterInvoke(IInvocation invocation) 
    { 
     _stopwatch.Stop(); 
     string message = string.Format("Execution of {0} took {1}.", 
      invocation.Request.Method, 
      _stopwatch.Elapsed); 

     _stopwatch.Reset(); 
    } 
} 

Odpowiedz

3

Trzeba to być wirtualne, dla ninject żeby go przechwycić:

public class MyService : IMyService 
{ 
    Logger log; 

    public MyService() 
    { 
     log = LogManager.GetLogger(this.GetType().FullName); 
    } 

    [Timing] 
    public virtual string GetString() 
    { 
     log.Info("log me!!"); 
     return "Cool string !!!!"; 
    } 

    public string GetUnInterceptString() 
    { 
     return "Not intercepted"; 
    } 
} 
+0

Dobrze, pamiętam, że widziałem gdzieś to wspomniane, działa teraz dzięki – Eatdoku

+0

czy możliwe jest przechwycenie prywatnych metod za pomocą atrybutu? – Eatdoku

+2

Nie z ninject, potrzebujesz postsharp, lub jakiejś innej magii AOP –

Powiązane problemy