Замок Виндзор: Как получить прокси для конкретного экземпляра?

StackOverflow https://stackoverflow.com/questions/1410351

Вопрос

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

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top