Pregunta

Tengo una necesidad de crear un proxy dinámico en C #. Quiero esta clase para envolver otra clase, y tomar por sí interfaz pública, reenvío de llamadas para esas funciones:

class MyRootClass
{
    public virtual void Foo()
    {
        Console.Out.WriteLine("Foo!");
    }

}

interface ISecondaryInterface
{
    void Bar();
}

class Wrapper<T> : ISecondaryInterface where T: MyRootClass
{
    public Wrapper(T otherObj)
    {
    }

    public void Bar()
    {
        Console.Out.WriteLine("Bar!");
    }
}

Así es como yo quiero usarlo:

Wrapper<MyRootClass> wrappedObj = new Wrapper<MyRootClass>(new MyRootClass());
wrappedObj.Bar();
wrappedObj.Foo();

a los productos:

Bar!
Foo!

¿Alguna idea?

¿Cuál es la manera más fácil de hacer esto?

¿Cuál es la mejor manera de hacer esto?

Muchas gracias.

Actualizar

He intentado siguiendo la recomendación de Wernight e implementar esto usando C # 4.0 proxies dinámicos. Por desgracia, todavía estoy atascado. El punto de la proxy es para imitar la otra interfaz que es (normalmente, por lo general) que se espera. Usando DynamicObject me obliga a cambiar todos los clientes de este a utilizar 'dinámica' en lugar de 'ISecondaryInterface'.

¿Hay una manera de conseguir un objeto proxy, de tal manera que cuando se coloca una A, que anuncia (estáticamente?) Que es compatible con la interfaz de A; y cuando se ajusta un B, que anuncia que es la interfaz de soportes de B?

ACTUALIZACIÓN 2

Por ejemplo:

class MySecretProxy : DynamicObject, ISecondaryInterface
{
    public override void TryInvokeMember(...) { .. }

    // no declaration of Bar -- let it be handled by TryInvokeMember
 }
¿Fue útil?

Solución

.NET 4 DynamicObject puede ayudar a lograr eso.

A principios de marco .NET puede utilizar:

  • Aspecto #
  • Encajar AOP
  • Spring.NET
  • Aspect.NET
  • AspectDNG
  • proxy dinámico
  • Componer *
  • Loom.NET
  • PostSharp

Cada uno de estos marcos de hacer uso de una serie técnicas para la inyección de código tanto antes como después de la ejecución de un método. Estos generalmente se dividen en 4 categorías.

  • inyección MSIL - Aquí inyectar código MSIL en el cuerpo de la método siendo ejecutado. (Agrega aguda)
  • inyección dinámica en tiempo de ejecución - El uso de técnicas tales como que la reflexión invocar métodos dinámicamente.
  • Tipo de inyección constructor - Relacionado con la inyección de tiempo de ejecución, creamos un tipo basado en el tipo deseamos solicitudes de proxy y luego mariscal a través de este tipo. (Proxy dinámico)
  • inyección Container - Solicitudes pasan a través de un recipiente que invoca código antes y después de la aplicación de este método en ejecución.

.

Sé que Castillo Proyecto 's Dynamic Proxy se utiliza a menudo (como en Moq para sólo mencionar un proyecto grande).


Responder al tema ACTUALIZADA

Lo que escriba no se compilará. dinámico proxies son generados en tiempo de ejecución de código, por lo que tendrá que crear una instancia concreta de la clase que actúe como apoderado de una manera u otra. Puede ser que usted está buscando hacer AOP (programación orientada a aspectos).

class MySecretProxy<T> : DynamicObject, T where T : new()
{
    private T _instance = new T();

    public override void TryInvokeMember(...) { ... }
}

MySecretProxy<Bar> bar;

Otros consejos

¿Usted ha mirado DynamicProxy del proyecto Castle? Se puede proporcionar en última instancia lo que estás tratando de lograr. Ver http://www.castleproject.org/dynamicproxy/index.html

También es de código abierto por lo que incluso podría desembolsar si es necesario.

Se puede hacer esto con RealProxy si el tipo de destino es una interfaz o se deriva de MarshalByRefObject.

Es posible que desee ver en Linfu que contiene un mecanismo dinámico proxy.

Sé que los proxies que utilizan nhibernate de carga diferida

Castillo

Linfu

Primavera ByteCode

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top