【问题标题】:Simple Injector, Function Not Being Intercepted?简单的喷油器,功能不被拦截?
【发布时间】:2014-12-29 01:56:58
【问题描述】:

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

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

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

我有一种感觉是因为我没有正确设置容器。有人可以告诉我在对 Controller 进行调用后,我需要如何更改我的 main 以查看 "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();
    }
}

【问题讨论】:

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


    【解决方案1】:

    问题是由于 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. 添加了注册控制器的代码
    2. 添加了从 Container 请求 Controller 实例的代码
    3. 将创建的类型从RedisController2 更改为IRedisController2(因为IRedisController2 是为拦截而配置的)

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多