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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top