Castelo de Windsor: Como recuperar proxy para instância específica?
-
05-07-2019 - |
Pergunta
Eu estou usando o Castelo de Windsor no meu projeto. Alguns componentes registrados são interceptados. Como os componentes são registrados através de interfaces, o Castelo de Windsor cria proxies de interface (Castelo de Windsor cria um tipo autônomo que implementa a interface e os delegados para a implementação real usando composição). Infelizmente você não pode executar métodos no âmbito da implementação real da interface, porque o proxy seria ignorada.
Existe uma maneira de obter a instância do proxy que representa a implementação real no âmbito da implementação real?
Aqui está um exemplo do que eu gostaria de alcançar. Eu quero interceptar sempre o método Get. Por favor, não vêm com formas alternativas para refatorar este exemplo porque este não é o meu código de produção, mas apenas algo inventado para demonstração.
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();
}
}
Como posso definir os _isso de campo para a instância do proxy?
Atenciosamente
Oliver Hanappi
PS:. Aqui está um exemplo do mundo real
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);
}
}
Eu estou resolvendo um modelo de apresentação transitória. Ela recebe uma visão transitória injetado. Porque as necessidades vista de saber sobre o modelo de apresentação, o modelo de apresentação chama IView.SetModel (this) para deixar a vista saber sobre seu modelo de apresentação.
O problema agora é que, embora o IPresentationModel resolvido é um proxy, o método setModel fica apenas a implementação real. Portanto, quando a visão chama métodos no modelo de apresentação, há interceptores estão sendo demitido.
A única solução que eu encontrei até agora, é definir modelo de apresentação da visão manualmente depois de eu ter resolvido o meu modelo de apresentação.
var model = _container.Resolve<IPresentationModel>();
model.View.SetModel(model);
Eu acho que, esta solução não é realmente resolvido muito bem.
Solução
Este é o chamado "vazando este" problema, e não há nenhuma boa maneira de resolver isso por proxies interface.
Provavelmente a etapa de pós-composição que você mencionou seria a melhor solução. Você pode usar Tuna de OnCreateFacility - ele é cozido no tronco, ou se você não deseja executar no tronco, você pode copiar o código do repositório e usá-lo com v2.0.