2010-04-16 76 views
1

我想更新一些使用DynamicProxy的代码到DynamicProxy2。特别是我们使用DynamicProxy来提供两个类的混合。安装程序是这样的:帮助从Castle.DynamicProxy迁移mixin到DynamicProxy2

public interface IHasShape 
{ 
    string Shape { get; } 
} 

public interface IHasColor 
{ 
    string Color { get; } 
} 

public interface IColoredShape : IHasShape, IHasColor 
{ 
} 

然后假设IHasShape和IHasColor的一些明显的具体实现,我们会创建这样一个mixin:

public IColoredShape CreateColoredShapeMixin(IHasShape shape, IHasColor color) 
{ 
    ProxyGenerator gen = new ProxyGenerator(); 
    StandardInterceptor interceptor = new StandardInterceptor(); 
    GeneratorContext context = new GeneratorContext(); 
    context.AddMiniInstance(color); 

    return gen.CreateCustomProxy(typeof(IColoredShape), intercetor, shape, context); 
} 

有IColoredShape没有具体的实现,除了结果的代理创建。 StandardInterceptor接受对IColoredShape对象的调用,并根据需要将它们委派给“形状”或“颜色”对象。

但是,我一直在玩新的DynamicProxy2,并找不到等效的实现。

+0

请编辑您的问题 - 它_seems_不完整。 – driis 2010-04-16 23:59:08

回答

3

好吧,如果我正确地理解了你的话,你有两个接口与实现,另一个接口实现它们并且你想在第三个接口下混合这两个接口的实现,对吗?

public IColoredShape CreateColoredShapeMixin(IHasShape shape, IHasColor color) 
{ 
    var options = new ProxyGenerationOptions(); 
    options.AddMixinInstance(shape); 
    options.AddMixinInstance(color); 
    var proxy = generator.CreateClassProxy(typeof(object), new[] { typeof(IColoredShape) }, options) as IColoredShape; 
    return proxy; 
} 
+0

是的,我有这么多的想法,但仍然无法得到它的工作。在你的例子中,“形状”对象根本不被使用。有没有简单的解决方法? – 2010-04-17 11:58:54

+0

形状对象应该做什么?它是为了什么? – 2010-04-17 14:15:04

+0

我想要一个纯粹的混合两个对象的形状和颜色。理想情况下,返回的代理实现了一个接口,该接口是IHasShape和IHasColor的组合。这样你可以清楚地表明代理具有mixin接口的事实。在这个例子中: http://kozmic.pl/archive/2009/08/12/castle-dynamic-proxy-tutorial-part-xii-mix-in-this-mix.aspx 返回的mixin是一个人和没有太多的信号,它也是一个字典,除了你可以施展它。我首先给出的使用DynamicProxy1的例子正是我需要的。 – 2010-04-17 21:38:13