Castle Windsor:如何检索特定实例的代理?

时间:2009-09-11 11:26:05

标签: c# proxy castle-windsor castle-dynamicproxy

我在我的项目中使用Castle Windsor。一些注册组件被截获。由于组件是通过接口注册的,因此Castle Windsor创建了接口代理(Castle Windsor创建了一个独立类型,它实现了接口并通过使用组合委托给实际实现)。遗憾的是,您无法在接口的实际实现中执行方法,因为代理将被绕过。

有没有办法获得代表实际实现中真实实现的代理实例?

这是我想要实现的一个例子。我想一直拦截Get方法。请不要使用其他方法来重构此示例,因为这不是我的生产代码,而只是为演示而发明的东西。

public interface IProvider
{
    bool IsEmpty { get; }
    object Get();
}

public class ProxyBypassingProvider : IProvider
{
    public bool IsEmpty
    {
        // Calls method directly, not through the proxy.
        get { return Get() == null; }
    }

    public object Get()
    {
        return new Object();
    }
}

public class InterceptedProvider : IProvider
{
    private IProvider _this; // Should hold the proxy instance.

    public bool IsEmpty
    {
        // Calls method through proxy.
        get { return _this.Get() == null; }
    }

    public object Get()
    {
        return new Object();
    }
}

如何将字段_this设置为代理实例?

最诚挚的问候 Oliver Hanappi

PS:这是一个真实世界的例子。

public interface IPresentationModel
{
    IView View { get; }
}

public interface IView
{
    void SetModel(IPresentationModel model);
}

public PresentationModel : IPresentationModel
{
    public IView View { get; private set; }

    public PresentationModel(IView view)
    {
        View = view;
        View.SetModel(this);
    }
}

我正在解决一个瞬态演示模型。它会注入瞬态视图。因为视图需要知道表示模型,所以表示模型调用IView.SetModel(this)让视图知道它的表示模型。
问题是,虽然解析的IPresentationModel是一个代理,但SetModel方法只获得真正的实现。因此,当视图调用表示模型上的方法时,不会触发拦截器。

我到目前为止找到的唯一解决方案是在解析我的演示模型后手动设置视图的演示模型。

var model = _container.Resolve<IPresentationModel>();
model.View.SetModel(model);

我认为,这个解决方案并没有真正解决。

1 个答案:

答案 0 :(得分:3)

这就是所谓的“泄漏这个”问题,并且没有很好的方法来解决这个接口代理问题。

您提到的后期合成步骤可能是最佳解决方案。您可以使用金枪鱼的OnCreateFacility - 它被烘焙到主干中,或者如果您不想在主干上运行,您可以从存储库中复制代码并将其与v2.0一起使用。