使用简单注入器与城堡代理拦截器

本文关键字:代理 城堡 简单 注入器 | 更新日期: 2023-09-27 18:10:55

我在asp.net mvc 4项目中使用简单的注入器。

我不知道如何使用城堡代理拦截器的简单注入器

使用简单注入器与城堡代理拦截器

在Simple Injector文档中有一节是关于拦截的,非常清楚地描述了如何进行拦截。这里给出的代码示例并没有显示如何使用Castle DynamicProxy,但是您实际上需要更改几行代码才能使其工作。

如果您使用拦截扩展代码片段,要使其工作,您只需要删除IInterceptorIInvocation接口,在文件顶部添加using Castle.DynamicProxy,并将通用Interceptor替换为以下内容:

public static class Interceptor
{
    private static readonly ProxyGenerator generator = new ProxyGenerator();
    public static object CreateProxy(Type type, IInterceptor interceptor,
        object target)
    {
        return generator.CreateInterfaceProxyWithTarget(type, target, interceptor);
    }
}

但至少,这将是你需要拦截城堡动态代理工作的代码:

using System;
using System.Linq.Expressions;
using Castle.DynamicProxy;
using SimpleInjector;
public static class InterceptorExtensions
{
    private static readonly ProxyGenerator generator = new ProxyGenerator();
    private static readonly Func<Type, object, IInterceptor, object> createProxy =
        (p, t, i) => generator.CreateInterfaceProxyWithTarget(p, t, i);
    public static void InterceptWith<TInterceptor>(this Container c, 
        Predicate<Type> predicate)
        where TInterceptor : class, IInterceptor
    {
        c.ExpressionBuilt += (s, e) =>
        {
            if (predicate(e.RegisteredServiceType))
            {
                e.Expression = Expression.Convert(
                    Expression.Invoke(
                        Expression.Constant(createProxy),
                        Expression.Constant(e.RegisteredServiceType, typeof(Type)),
                        e.Expression,
                        c.GetRegistration(typeof(TInterceptor), true).BuildExpression()),
                    e.RegisteredServiceType);
            }
        };
    }
}

这是如何使用这个:

container.InterceptWith<MonitoringInterceptor>(
    type => type.IsInterface && type.Name.EndsWith("Repository"));

允许拦截所有以'Repository'结尾的接口注册,并使用瞬态MonitoringInterceptor拦截。