我使用Castle的DynamicProxies找到了解决方案
// I developed an extension method on the IWindsorContainer
public static void RegisterMapper<TSpeakingInterface,TInternal,TExternal>(this IWindsorContainer container,MapperConfig config)
where TSpeakingInterface : IKeyMapper<TInternal,TExternal>
{
container.Register(
Component
.For<IMapCompanyToPayrollCompany>()
.UsingFactoryMethod(() => {
var generator = new ProxyGenerator(); // <--Documentation recommend this to be a Singleton for performance and memory reason ...
var keyMapperFactory = new KeyMapperFactory();
var mapper = keyMapperFactory.GetMapper<TInternal,TExternal>(config);
var interceptor = new KeyMapperInterceptor<TInternal,TExternal>(mapper);
// see: https://github.com/castleproject/Windsor/issues/224
var nullProxy = generator.CreateInterfaceProxyWithoutTarget<TSpeakingInterface>();
return generator.CreateInterfaceProxyWithTarget(nullProxy,interceptor);
})
);
}
// Now I can register a mapper this way:
var container = new WindsorContainer();
var config = new MapperConfig {
[...] // mapper config stuff here
}
container.RegisterMapper<IMapCompanyToPayrollCompany,CompanyId,PayrollCompanyId>(config);
拦截器很简单
public class KeyMapperInterceptor<TInternal,TExternal> : IInterceptor
{
private readonly IKeyMapper<TInternal,TExternal> realMapper;
public KeyMapperInterceptor(IKeyMapper<TInternal,TExternal> realMapper)
{
this.realMapper = realMapper;
}
public void Intercept(IInvocation invocation)
{
// We simply call the corresponding method on the realMapper
var method = invocation.Method;
invocation.ReturnValue = method.Invoke(realMapper,invocation.Arguments);
}
}
...并且有效!
当然,IMapCompanyToPayrollCompany
中不允许使用其他方法或属性,因为拦截器将尝试在不了解任何内容的“ realMapper”上执行/访问它们!
本文链接:https://www.f2er.com/3158466.html