【问题标题】:How to force Castle.DynamicProxy to ignore changing versions of dependencies如何强制 Castle.DynamicProxy 忽略更改版本的依赖项
【发布时间】:2014-05-09 00:01:51
【问题描述】:

我将Castle.DynamicProxy 用于AOP。我的 IoC 容器是 Ninject 3.2,在它返回已解析的依赖项后,我将它们中的大部分放入基于 Castle 的包装器中。 (我不能使用Ninject.Extensions.Interception,因为它与Ninject.Extensions.Conventions for NInject 3.0.1.0/3.2 冲突)

问题是我的代码依赖于每天都在变化的二进制文件(签名程序集)(我的代码是一堆产品的测试框架)。如果程序集带有新版本,Castle 开始抛出异常“There was an error in static constructor on type Castle.Proxies.[MyClassName]Proxy. This is likely a bug in DynamicProxy. Please report it.".

我的 Castle 代码:

internal static T ResolveAndProxify<T>(object[] arguments, params IParameter[] parameters) where T : class
{
    var objectToProxy = default(T);
    if (null == parameters || 0 == parameters.Length) {
        objectToProxy = _kernel.Get<T>(new IParameter[] {});
    } else {
        objectToProxy = _kernel.Get<T>(parameters);
    }
    if (/* condition not to proxify */) {
        return objectToProxy;
    } else {
        if (null == arguments || 0 == arguments.Length) {
            return (T)_proxyGenerator.CreateClassProxy(
                typeof(T),
                new LoggingAspect(), new ErrorHandlingAspect());
        } else {
            return (T)_proxyGenerator.CreateClassProxy(
                typeof(T),
                arguments,
                new LoggingAspect(), new ErrorHandlingAspect());
        }
    }
}

如果我关闭 Castle,一切正常:

internal static T ResolveAndProxify<T>(object[] arguments, params IParameter[] parameters) where T : class
{
    var objectToProxy = default(T);
    if (null == parameters || 0 == parameters.Length) {
        objectToProxy = _kernel.Get<T>(new IParameter[] {});
    } else {
        objectToProxy = _kernel.Get<T>(parameters);
    }

    return objectToProxy;
}

Castle 组件的声明和创建:

private static readonly ProxyGenerator _proxyGenerator;

// I tried several ways
var scope = new ModuleScope(false, true);
var proxyBuilder = new DefaultProxyBuilder(scope);
var proxyArgument = new ConstructorArgument("builder", proxyBuilder);
_proxyGenerator = _kernel.Get<ProxyGenerator>(proxyArgument);

Bind<ProxyGenerator>().ToConstructor(arg => new ProxyGenerator(arg.Inject<IProxyBuilder()));

我在stackoverflow.com这里看到了一个示例(在 cmets 中),对于 Castle Windsor,如何关闭缓存或将 Castle 与确切版本的程序集联系起来的东西。没有Castle Windsor怎么办?

【问题讨论】:

  • 我也尝试过here 设置代理生成器 - 同样的问题。 _proxyGenerator = new ProxyGenerator(true);

标签: c# aop interceptor castle-dynamicproxy


【解决方案1】:

我部分解决了这个问题。 我注意到该异常仅在特定类上引发。 例如:

public virtual ObjectTypeFromThirdPartySignedAssembly PropertyName { get; set; }

public virtual ObjectTypeFromThirdPartySignedAssembly MethodName()
{
}

public virtual void Method2(ObjectTypeFromThirdPartySignedAssembly inputObject)
{
}

可以看出,代理在这里直接与依赖项一起工作。因为我找到了问题的根源,所以我跳过了这些类的代理。当然,这不是最好的解决方案,但我可以使用日志记录、错误处理和其他拦截器来包装我的类的一部分。

【讨论】:

    猜你喜欢
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2016-07-29
    • 2014-10-13
    • 2011-09-04
    相关资源
    最近更新 更多