Замок Виндзор: Как получить прокси для конкретного экземпляра? - PullRequest
3 голосов
/ 11 сентября 2009

Я использую 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);

Я думаю, это решение не очень хорошо решено.

1 Ответ

3 голосов
/ 11 сентября 2009

Это так называемая проблема «утечки информации», и нет хорошего способа решения этой проблемы для прокси интерфейсов.

Вероятно, упомянутый вами шаг после компоновки будет лучшим решением. Вы можете использовать Tuna's OnCreateFacility - он запекается в ствол, или, если вы не хотите запускаться в стволе, вы можете скопировать код из хранилища и использовать его с версией 2.0.

...