3

我试图让一个横切关注点拦截我在控制器上的调用,但由于某种原因,它们没有被拦截。

我基本上是想让这里的例子起作用: http ://simpleinjector.readthedocs.org/en/latest/InterceptionExtensions.html

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

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

编码:

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

2 回答 2

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. 将正在创建的类型从更改RedisController2IRedisController2(因为IRedisController2已配置为拦截)
于 2014-12-29T08:58:51.043 回答
1

假设它SimpleInjector的工作方式与所有 IOC 容器的 90% 相同,它RealProxy在幕后使用*(考虑到它最有可能的签名,尽管完全违背了 的精神SimpleInjector)。

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

RealProxy由于明显的原因(如果您深入思考了一段时间),可以与接口一起使用。即使它可以与基类一起使用,该基类也必须声明它的方法virtual才能使您的代码正常工作。

重新编写代码以在调用时使用接口RedisController2,并在注册时删除所有对RedisController2except 的引用。

于 2014-12-29T09:09:43.900 回答