简单的注射器,功能不被拦截?

时间:2014-12-29 01:56:58

标签: c# simple-injector aop cross-cutting-concerns

我正试图在我的控制器上拦截我的电话,但由于某种原因他们没有被截获。

我基本上试图让这个例子起作用: http://simpleinjector.readthedocs.org/en/latest/InterceptionExtensions.html

他们在拦截部分也有其他一些信息: http://simpleinjector.readthedocs.org/en/latest/advanced.html

我有一种感觉,因为我没有正确设置容器。有人可以告诉我在控制器上的调用完成后我需要如何更改主要内容以查看"Intercepted!!!"吗?此外,有人可以告诉我Container的设置是否错误,如果是,请解释我的错误。

守则:

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

2 个答案:

答案 0 :(得分:5)

问题是由于 Container 未创建 Controller ,因此无法拦截对其进行的调用。试试这个:

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. 添加了注册 Controller
  2. 的代码
  3. 添加了代码以从 Container
  4. 请求 Controller 的实例
  5. 将正在创建的类型从RedisController2更改为IRedisController2(因为IRedisController2已被配置为拦截)

答案 1 :(得分:1)

假设SimpleInjector的工作方式与所有IOC容器的90%相同,它使用RealProxy封面*(鉴于签名最有可能,尽管完全违背了SimpleInjector)。

  

注意:拦截扩展代码片段使用.NET的System.Runtime.Remoting.Proxies.RealProxy类来生成拦截代理。 RealProxy仅允许代理接口。 [source]

RealProxy适用于接口,原因很明显(如果你对它有一段时间的深入思考)。即使它可以使用基类,该基类也必须将其方法声明为virtual,以使代码工作。

在调用RedisController2时重写您的代码以使用接口,并删除除RedisController2之外的所有引用。