Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何强制Castle.DynamicProxy忽略依赖项的更改版本_C#_Aop_Interceptor_Castle Dynamicproxy - Fatal编程技术网

C# 如何强制Castle.DynamicProxy忽略依赖项的更改版本

C# 如何强制Castle.DynamicProxy忽略依赖项的更改版本,c#,aop,interceptor,castle-dynamicproxy,C#,Aop,Interceptor,Castle Dynamicproxy,我对AOP使用Castle.DynamicProxy。我的IoC容器是Ninject 3.2,在它返回已解析的依赖项后,我将它们中的大部分放在基于Castle的包装器中。(我不能使用Ninject.Extensions.Interception,因为它与Ninject 3.0.1.0/3.2的Ninject.Extensions.Conventions冲突) 问题是我的代码依赖于每天都在变化的二进制文件(签名程序集)(我的代码是一系列产品的测试框架)。如果程序集附带新版本,Castle将开始抛出

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

问题是我的代码依赖于每天都在变化的二进制文件(签名程序集)(我的代码是一系列产品的测试框架)。如果程序集附带新版本,Castle将开始抛出异常“
Castle.Proxy。[MyClassName]Proxy]类型的静态构造函数中出现错误。这可能是DynamicProxy中的错误。请报告。”。

我与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());
        }
    }
}
内部静态T ResolveAndProxify(对象[]参数,参数IPParameter[]参数),其中T:class
{
var objectToProxy=默认值(T);
if(null==parameters | | 0==parameters.Length){
objectToProxy=_kernel.Get(新的IParameter[]{});
}否则{
objectToProxy=_kernel.Get(参数);
}
如果(/*条件不用于代理*/){
返回objectToProxy;
}否则{
if(null==参数| | 0==参数.Length){
返回(T)\u proxyGenerator.CreateClassProxy(
类型(T),
新的LoggingAspect(),新的ErrorHandlingAspect());
}否则{
返回(T)\u proxyGenerator.CreateClassProxy(
类型(T),
论据,
新的LoggingAspect(),新的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;
}
内部静态T ResolveAndProxify(对象[]参数,参数IPParameter[]参数),其中T:class
{
var objectToProxy=默认值(T);
if(null==parameters | | 0==parameters.Length){
objectToProxy=_kernel.Get(新的IParameter[]{});
}否则{
objectToProxy=_kernel.Get(参数);
}
返回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()));
专用静态只读ProxyGenerator\u ProxyGenerator;
//我试过几种方法
var范围=新模块范围(假、真);
var proxyBuilder=新的DefaultProxyBuilder(范围);
var proxyArgument=新构造函数参数(“生成器”,proxyBuilder);
_proxyGenerator=\u kernel.Get(proxyArgument);

Bind().ToConstructor(arg=>newproxygenerator(arg.InjectI部分修复了该问题。 我注意到异常只在特定类上抛出。 例如:

public virtual ObjectTypeFromThirdPartySignedAssembly PropertyName { get; set; }

public virtual ObjectTypeFromThirdPartySignedAssembly MethodName()
{
}

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

我也尝试了如上所述设置代理生成器-same问题。
\u代理生成器=新代理生成器(true);