什么是最好的方式来实施一个动态的代理在C#?
-
15-10-2019 - |
题
我已经得到了需要创建一个动态的代理。我希望此类包裹的另一类,并采取在它的公共接口、转发的电话对于这些功能:
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)要求我改变所有的客户的信用'动态"而不是"ISecondaryInterface'.
有没有办法得到代理的对象,这样,当这包裹一,它通告(静态?) 它支持一的接口;当它包B,它通告,为支持B的接口?
更新2
例如:
class MySecretProxy : DynamicObject, ISecondaryInterface
{
public override void TryInvokeMember(...) { .. }
// no declaration of Bar -- let it be handled by TryInvokeMember
}
解决方案
.净4 DynamicObject
可以帮助你实现这一目标。
早。净框架可以使用:
- 一方面#
- 包住AOP
- Spring.NET
- Aspect.NET
- AspectDNG
- 动代理
- 撰写*
- Loom.NET
- PostSharp
这些框架使用的号码 技术注入的代码 之前和之后的执行 法。这些一般分为4 类别。
- 集的注射 –我们在这里注入集码进入体内的 方法正在执行。(后急剧)
- 运行时动态喷射 –使用技术,例如反映我们 调用的方法动态。
- 类型的建设者注射 –有关运行时注,我们创建了一个类型的基础上 的类型,我们希望代理然后警长的请求,通过这种类型。(动态代理)
- 容器喷射 –请求通过一个容器 调用代码之前和之后我们方法正在执行。
看看 完整的文章.
我知道, 城堡的项目's 动代理 通常被用(如同在 最低采购量 只是一个大项目)。
答复,更新题目
你写了什么不会编译。 动态 代理运行时产生的代码,所以你必须创建一个具体实例之类的你是代理某种方式或另一种。可以你想做的 AOP (面向方面编程)。
class MySecretProxy<T> : DynamicObject, T where T : new()
{
private T _instance = new T();
public override void TryInvokeMember(...) { ... }
}
MySecretProxy<Bar> bar;
其他提示
您是否查看了城堡项目的动态proxy?它可能会提供您最终试图实现的目标。看 http://www.castleproject.org/dynamicproxy/index.html
它也是开源的,因此您甚至可以在需要时分叉。
如果目标类型是接口或源自MarshalbyRefobject的接口,则可以使用RealProxy执行此操作。
你可能想看看 linfu 其中包含动态代理机制。
我知道Nhibernate用于懒惰加载的代理
城堡
linfu
弹簧字节码