什么是控制反转/面向方面意义上的.NET代理对象?

时间:2008-11-13 16:47:26

标签: c# .net inversion-of-control aop proxy-classes

控制反转/面向方面意义上的代理对象是什么?

关于代理对象是什么的好文章? 你为什么要用它? 如何在C#中编写一个?

2 个答案:

答案 0 :(得分:15)

通常,Proxy对象是一个对象(类的实例),它公开与“真实类”完全相同的公共接口,但只是将对其成员的所有调用转发给另一个真实类。代理对象的使用有多种原因......

一个目的是“假装”成为真正的类,因此客户端组件(或对象)可以“相信”它与“真实”对象交谈,但在代理内部,其他内容,(如日志记录,事务支持)正在同时进行...其次,代理可以非常便宜地与真实对象进行比较。并且经常被使用以便当客户端不使用它们时可以节省(关闭或释放到池以供其他客户端使用)...代理保持“活着”并且客户端认为它仍然具有与真实对象的连接,但每当它“调用”对象时,它实际上是在调用代理,代理只是为了处理调用而获取另一个真实对象,然后在调用完成后释放真实对象。

关于控制反转(IOC)..这是指一种常见模式(也称为依赖注入),其中类中的依赖对象被“注入”到实例中该类,从客户端代码,控制实例将使用的依赖对象的版本... IOC可用于将“代理”对象注入到它认为使用真实对象的类中... 控制反转指的是当使用这种模式时,关于调用哪个实际实现的决定不再受制作调用的类的控制,而是受该类的客户端的控制,当依赖对象的实例注入要用于此调用的类时。

通常,术语IOC与所谓的 IOC容器一起使用,这是一个专门设计用于根据有关这些类的松散耦合信息创建依赖类实例的类(类型)它来自除硬连线依赖之外的某些来源(最常见的是来自某种配置文件)。通常,当您使用IOC容器时,在应用程序启动时创建它的实例,然后(通过读取配置数据或其他),您“注册”IOC容器将负责的每个类(类型) ,具有关键值。密钥通常是此注册的所有实例必须实现的抽象类型或接口。然后,在应用程序的正常操作中,您可能会在其中新建一个这些类型的实例,您可以调用IOC容器,并使用抽象类型/接口作为键来请求它实例。然后,IOC容器使用反射或动态加载(或其他)来创建已使用该键“注册”的任何类型的实例。通过这种方式,只需更改配置数据,即可控制应用程序使用的实际类型,在一个环境或部署位置更改它们与另一个环境或部署位置。

答案 1 :(得分:1)

关于这一点的一个非常好的资源是旧的“四人帮”设计模式书。本书对任何开发面向对象软件的人都非常有用。 我个人使用代理对象来延迟加载NHibernate。我不使用具有控制反转的代理,因为我只使用IoC来解析接口类型。

查尔斯布雷塔纳的解释非常好。

我无法想象代理与AoP之间的关系。有人可以在这解释一下吗?