3

我在我的项目中使用 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 设置为代理实例?

最好的问候
奥利弗·哈纳皮

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);

我认为,这个解决方案并没有很好地解决。

4

1 回答 1

3

这就是所谓的“泄露这个”问题,对于接口代理来说没有解决这个问题的好方法。

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

于 2009-09-11T15:27:06.050 回答