Pregunta

Estoy usando Castle Windsor en mi proyecto. Algunos componentes registrados son interceptados. Debido a que los componentes se registran a través de interfaces, Castle Windsor crea proxies de interfaz (Castle Windsor crea un tipo independiente que implementa la interfaz y los delegados a la implementación real mediante el uso de la composición). Lamentablemente, no puede ejecutar métodos dentro de la implementación real de la interfaz, ya que el proxy se omitirá.

¿Hay alguna forma de obtener la instancia del proxy que represente la implementación real dentro de la implementación real?

Aquí hay un ejemplo de lo que me gustaría lograr. Quiero interceptar siempre el método Get. Por favor, no venga con formas alternativas de refactorizar este ejemplo porque este no es mi código de producción sino simplemente algo inventado para demostración.

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();
    }
}

¿Cómo puedo configurar el campo _este a la instancia del proxy?

Saludos cordiales
Oliver Hanappi

PS: Aquí hay un ejemplo del 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);
    }
}

Estoy resolviendo un modelo de presentación transitoria. Consigue una vista transitoria inyectada. Debido a que la vista necesita conocer el modelo de presentación, el modelo de presentación llama a IView.SetModel (esto) para que la vista conozca su modelo de presentación.
El problema ahora es que, aunque el IPresentationModel resuelto es un proxy, el método SetModel solo obtiene la implementación real. Por lo tanto, cuando la vista llama a los métodos en el modelo de presentación, no se disparan interceptores.

La única solución que he encontrado hasta ahora, es configurar el modelo de presentación de la vista manualmente después de haber resuelto mi modelo de presentación.

var model = _container.Resolve<IPresentationModel>();
model.View.SetModel(model);

Creo que esta solución no se resuelve muy bien.

¿Fue útil?

Solución

Esto se denomina " filtrado de este " problema, y ??no hay una buena manera de resolver esto para los proxies de interfaz.

Probablemente el paso posterior a la composición que mencionaste sea la mejor solución. Puede usar OnCreateFacility de Tuna de Tuna en el tronco, o si no desea ejecutarlo, puede copiar el código del repositorio y usarlo con v2.0.

scroll top