我正试图在我的控制器上拦截我的电话,但由于某种原因他们没有被截获。
我基本上试图让这个例子起作用: 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();
}
}
答案 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();
请注意我:
RedisController2
更改为IRedisController2
(因为IRedisController2
已被配置为拦截)答案 1 :(得分:1)
假设SimpleInjector
的工作方式与所有IOC容器的90%相同,它使用RealProxy
封面*(鉴于签名最有可能,尽管完全违背了SimpleInjector
)。
注意:拦截扩展代码片段使用.NET的System.Runtime.Remoting.Proxies.RealProxy类来生成拦截代理。 RealProxy仅允许代理接口。 [source]
RealProxy
适用于接口,原因很明显(如果你对它有一段时间的深入思考)。即使它可以使用基类,该基类也必须将其方法声明为virtual
,以使代码工作。
在调用RedisController2
时重写您的代码以使用接口,并删除除RedisController2
之外的所有引用。