我使用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
怎么办?
我也试着说[这里](http://stackoverflow.com/questions/13553004/castle-dynamicproxy-interceptor-having-problems-with-different-assemblies)来设置代理生成器 - 同样的问题。 '_proxyGenerator = new ProxyGenerator(true);' –