Как лучше всего реализовать динамический прокси в C#?
-
15-10-2019 - |
Вопрос
Мне нужно создать динамический прокси в C#. Я хочу, чтобы этот класс завершил другой класс, и взял на себя публичный интерфейс, пересылав вызовы этих функций:
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!");
}
}
Вот как я хочу его использовать:
Wrapper<MyRootClass> wrappedObj = new Wrapper<MyRootClass>(new MyRootClass());
wrappedObj.Bar();
wrappedObj.Foo();
производить:
Bar!
Foo!
Любые идеи?
Какой самый простой способ сделать это?
Как лучше всего это сделать?
Спасибо большое.
ОБНОВИТЬ
Я попытался следовать рекомендации Wernight и реализовать это с помощью динамических прокси C# 4.0. К сожалению, я все еще застрял. Точка прокси заключается в том, чтобы имитировать другой интерфейс, который (обычно обычно) ожидается. Использование DynamicObject требует, чтобы я изменил всех клиентов, чтобы использовать «Dynamic» вместо «IseCondaryInterface».
Есть ли способ получить прокси -объект, так что, когда он завершает A, он рекламирует (статически?), Что он поддерживает интерфейс A; И когда он завершает B, он рекламирует, что поддерживает интерфейс B?
Обновление 2
Например:
class MySecretProxy : DynamicObject, ISecondaryInterface
{
public override void TryInvokeMember(...) { .. }
// no declaration of Bar -- let it be handled by TryInvokeMember
}
Решение
.NET 4 DynamicObject
может помочь вам достичь этого.
Ранее .NET Framework может использовать:
- Аспект#
- Заказ aop
- Spring.net
- Аспект.net
- Аспект
- Динамический прокси
- Составьте*
- Loom.net
- Postsharp
Каждая из этих структур использует числовые методы для инъекции кода как до, так и после выполнения метода. Обычно они делятся на 4 категории.
- Инъекция MSIL - Здесь мы внедряем код MSIL в тело выполняемого метода. (Post Sharp)
- Динамическая инъекция времени выполнения - Используя такие методы, как отражение, мы динамически вызываем методы.
- Инъекция типа строителя - В связи с инъекцией времени выполнения, мы создаем тип, основанный на типе, который мы хотим прокси, а затем запрашивают маршал с помощью этого типа. (Динамический прокси)
- Инъекция контейнера - Запросы проходят через контейнер, который вызывает код до и после выполнения нашего метода.
Увидеть Полная статья.
я знаю это Замок ПроектS. Динамический прокси часто используется (как в Могил Просто чтобы назвать один большой проект).
Ответить на обновленную тему
То, что вы написали, не будет компилироваться. Динамика Прокси - это код, сгенерированный во время выполнения, поэтому вам придется создать конкретный экземпляр класса, который вы оцениваете, так или иначе. Может быть, вы хотите сделать Аоп (Аспективное программирование).
class MySecretProxy<T> : DynamicObject, T where T : new()
{
private T _instance = new T();
public override void TryInvokeMember(...) { ... }
}
MySecretProxy<Bar> bar;
Другие советы
Вы смотрели на динамику проекта Castle? Это может обеспечить то, что вы в конечном итоге пытаетесь достичь. Видеть http://www.castleproject.org/dynamicproxy/index.html
Это также с открытым исходным кодом, так что вы можете даже расколоть его, если это необходимо.
Вы можете сделать это с помощью REALPROXY, если целевой тип является интерфейсом или вытекает из Marshalbyrefobject.
Вы можете посмотреть Линфу который содержит динамический прокси -механизм.
Я знаю прокси, которые используются Nhibernate для ленивой нагрузки
Замок
Линфу
Весенний байт -код