【发布时间】:2013-09-01 17:10:25
【问题描述】:
我有一个List<T> 类型的私有成员,其中T 是丰富的域对象。我的应用程序中的域包含许多需要 T 的方法。
我只想公开IList<IT> 类型的公共属性,其中T : IT。 IT 占用空间小,由 DTO 实现。
由于我无法将List<T> 转换为IList<IT>,因此我在属性声明中使用List<T>.ConvertAll。
有没有更好的方法来做到这一点?更快、更优雅?
编辑以提供更多细节
T 是一个基类,存在许多派生类,每个派生类都有许多不同的风格(在运行时加载的配置)。表示层中的用户可以添加/更改/删除任何配置的这些派生类的任何实例。实例也可以由用户定向地相互链接,但是有一些复杂的规则来管理允许的链接;有些在编译时已知,有些仅在运行时已知(基于配置)。有些实例可能是双联的,有些是交联的,有些是单向的,有些是单向的,有些则完全没有。
为此,T 包含任何此类链接的有效目标列表。表示层以图形方式突出显示这些有效目标,如果目标不在有效列表中,则不允许链接。当新创建、更改或删除任何实例时,每个实例的 ValidTargets 列表都需要重新评估,并且可能会发生变化。
T 类上还有很多其他成员和方法,工厂和服务类期望对其进行操作。有些行为与上面的示例非常相似。这些都不应该暴露在程序集之外。
【问题讨论】:
-
它需要是可变的吗?
-
Stefan 正如@SLaks 所暗示的那样。这取决于您希望客户实际使用该列表做什么。他们是否允许添加或从中删除?它是否在多个客户端之间共享?它本身是否代表一个领域概念(例如命令、查询……)?等等。这取决于您的用例。
-
如果你的列表是只读的,你可以使用IReadOnlyList
。 -
是的,它确实需要是可变的。
标签: c# list domain-driven-design ilist convertall