4

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

关于代理对象是什么的任何好文章?
为什么要使用一个?
以及如何用 C# 编写一个?

4

2 回答 2

17

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

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

至于控制反转(IOC)。这是指一种通用模式(也称为依赖注入),其中类内部的依赖对象从客户端代码“注入”到类的实例中,以控制哪个实例将使用的依赖对象的版本... IOC 可用于将“代理”对象注入到它认为正在使用真实对象的类中...控制反转一词指的是在使用在这种模式下,关于调用哪个实际实现的决定不再由进行调用的类控制,而是由该类的客户端控制,当它将依赖对象的实例注入要用于此的类中时称呼。

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

于 2008-11-13T17:05:24.920 回答
1

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

Charles Bretana 的解释非常好。

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

于 2008-11-13T19:53:16.187 回答