C# 如何强制Castle.DynamicProxy忽略依赖项的更改版本
我对AOP使用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将开始抛出
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);