如何在使用容器在运行时跟踪对象时设计透明API

时间:2012-01-17 14:19:26

标签: c# design-patterns reflection console containers

目的:我想要做的是为我的WinForm应用程序实现一个控制台,以便在运行时查询某些对象(即实现接口)属性。我想列出一些Type的所有实例,并显示所选实例的所有属性。呀。

在阅读问题“How do I get all instances of all loaded types that implement a given interface?”之后,我确定这不能以合理的方式完成(即没有走堆?!)并评估容器方法,这样实例会将自己注册到容器中并在销毁时注销它,但是我对我得到的替代品不满意:

  • 从处理容器工作的基类派生所有类:我不喜欢继承。
  • 实现容器服务和构造函数 - 注入它:我提出的最好的一个,但我正在寻求一个更透明的解决方案。

问题:使用容器方法时,是否有更好的(更透明,最小锁定)模式?

注意:也欢迎用于相同目的的替代方法。

2 个答案:

答案 0 :(得分:0)

如果您不接受继承,则可以尝试使用PostSharp之类的AOP框架来跟踪对象。您可以使用合适的属性装饰要跟踪的所有对象,并将该属性与postsharp构造相关联。

我已经用它来成功实现了undo redo。

答案 1 :(得分:0)

让每个类处理容器工作是最透明的解决方案。让所有类继承自基类是最简单的方法,但可能会妨碍你想要继承的其他事情。但是不应该涉及那么多的代码,因此为每个类复制它应该不是一个大问题,并且某些静态方法可能会摆脱几乎所有这些。

然而,我认为更好的解决方案是在接口上添加几个方法:激活(或者可能是Initialize)和Deactivate(Dispose?)。实现Activate和Deactivate的类的方法可以如上所述工作,也可以根据需要调用容器服务。

你必须记住调用这些方法,但它们会给你很多力量。他们可以处理在构造函数中可能无法正常工作的其他初始化。如果您发现某些对象不需要在那里,它们允许单个对象选择退出容器。它还允许它选择您将来可能使用的其他容器。简而言之,任何类的对象都有很大的自由来在程序结构中处理自己的业务,并且程序可以通过一些简单的方法调用来创建和管理大量不同类的复杂对象。