2014-12-29 4 views
3

Я пытаюсь перекрещивать озабоченность перехватывать мои вызовы на моем контроллере, но по какой-то причине они не перехватываются.Простой инжектор, функция не перехвачена?

Я в основном пытаюсь получить пример здесь работать: http://simpleinjector.readthedocs.org/en/latest/InterceptionExtensions.html

Они имеют некоторую другую информацию в разделе перехвата здесь тоже: http://simpleinjector.readthedocs.org/en/latest/advanced.html

У меня есть чувство, что это потому, что я не правильно настроив контейнер. Может ли кто-нибудь показать мне, как мне нужно изменить мою главную, чтобы увидеть "Intercepted!!!" после того, как сделаны вызовы на контроллере? Кроме того, может кто-нибудь сказать мне, если установка для контейнера была неправильной, и если да, объясните мою ошибку (ы).

Кодекс:

static void Main() 
{ 
    Console.WriteLine("Start");  

    RedisController2 redisController = new RedisController2();  

    Container _container = new Container(); 
    _container.InterceptWith<MonitoringInterceptor>(type => type == typeof(IRedisController2)); 
    _container.RegisterSingle<MonitoringInterceptor>();  

    redisController.PrintSomething(); 
    redisController.PrintOther();  

    Console.WriteLine("Press any key to exit."); 
    Console.ReadKey(); 
} 

internal class MonitoringInterceptor : IInterceptor 
{  

    public MonitoringInterceptor() 
    {  

    }  

    public void Intercept(IInvocation invocation) 
    { 
     invocation.Proceed();  

     //var decoratedType = invocation.InvocationTarget.GetType();  

     Console.Write("Intercepted!!!"); 
     Console.ReadKey(); 
    } 
} 

ответ

5

Проблема связана с тем, что Контейнер не создающего контроллер и, следовательно, не могут перехватывать вызовы, сделанные к нему. Попробуйте это:

Console.WriteLine("Start");  

Container _container = new Container(); 
_container.Register<IRedisController2, RedisController2>(); // 1 
_container.InterceptWith<MonitoringInterceptor>(type => 
    type == typeof(IRedisController2)); 
_container.RegisterSingle<MonitoringInterceptor>();  

IRedisController2 redisController = 
    _container.GetInstance<IRedisController2>(); // 2, 3 

redisController.PrintSomething(); 
redisController.PrintOther();  

Console.WriteLine("Press any key to exit."); 
Console.ReadKey(); 

Обратите внимание, что у меня есть:

  1. добавил код, чтобы зарегистрировать контроллер
  2. добавлен код для запроса экземпляра контроллера из Container
  3. изменил тип, созданный с RedisController2 на IRedisController2 (потому что IRedisController2 является то, что был сконфигурирован для перехвата)
1

Предполагая, что SimpleInjector работает таким же образом, как и 90% всех контейнеров МОК, он использует RealProxy под одеялом * (данную подпись это, скорее всего, хотя полностью против духа SimpleInjector).

Примечание. В фрагментах кода расширения перехвата используется класс .NET System.Runtime.Remoting.Proxies.RealProxy для генерации прокси-серверов перехвата. RealProxy позволяет только прокси-интерфейсам. [source]

RealProxy работы с интерфейсами, из-за очевидной причине (если вы думаете, глубоко об этом на некоторое время). Даже если он может работать с базовым классом, этот базовый класс должен объявить свой метод как virtual для того, чтобы ваш код работал.

Исправьте свой код для использования интерфейсов при вызове RedisController2 и удалите все ссылки на RedisController2, за исключением регистрации.

 Смежные вопросы

  • Нет связанных вопросов^_^