Я использую 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);
Я думаю, это решение не очень хорошо решено.