2014-03-29 99 views
1

我使用Castle.DynamicProxy作为AOP。我的IoC容器是Ninject 3.2,并且在它返回已解析的依赖关系之后,我将它们大部分放到基于Castle的包​​装器中。 (因为它与Ninject.Extensions.Conventions for NInject 3.0.1.0/3.2冲突,我不能使用Ninject.Extensions.Interception如何强制Castle.DynamicProxy忽略依赖关系的更改版本

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

我的代码与城堡:

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

如果我关闭了城堡,所有的作品:

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; 
} 

宣言和创建城堡配件:

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示例(在评论中)如何关闭缓存或将Castle连接到Castle Windsor的装配的确切版本。没有Castle Windsor怎么办?

+0

我也试着说[这里](http://stackoverflow.com/questions/13553004/castle-dynamicproxy-interceptor-having-problems-with-different-assemblies)来设置代理生成器 - 同样的问题。 '_proxyGenerator = new ProxyGenerator(true);' –

回答

1

我解决了部分问题。 我注意到这个异常只会在特定的类上抛出。 例如:

public virtual ObjectTypeFromThirdPartySignedAssembly PropertyName { get; set; } 

public virtual ObjectTypeFromThirdPartySignedAssembly MethodName() 
{ 
} 

public virtual void Method2(ObjectTypeFromThirdPartySignedAssembly inputObject) 
{ 
} 

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