2014-12-29 60 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. 添加代碼以從集裝箱
  3. 請求 控制器的一個實例
  4. 將正在創建的類型從RedisController2更改爲IRedisController2(因爲IRedisController2是什麼已經配置了攔截)
1

假設SimpleInjector被以同樣的方式工作,因爲所有IOC容器的90%,它底層使用RealProxy *(給了它是最有可能的簽名,雖然完全違背SimpleInjector的精神)。

注意:攔截擴展代碼片段使用.NET的System.Runtime.Remoting.Proxies.RealProxy類生成攔截代理。 RealProxy只允許代理接口。 [source]

RealProxy作品與接口,由於顯而易見的原因(如果你想深入思考了一會兒)。即使它可以與基類一起工作,該基類也必須將其方法聲明爲virtual,以使代碼有效。

在調用RedisController2時重寫代碼以使用接口,並刪除除註冊以外的所有對RedisController2的引用。