【发布时间】:2011-08-22 23:01:14
【问题描述】:
我面临着一个设计挑战,我似乎无法以令人满意的方式解决。我有一个类库程序集,其中包含我所有的共享 ORM 对象(使用 EntitySpaces 框架)。这些对象在 2 个或更多不同的应用程序中使用,这就是它们在自己的程序集中的原因。这个设置对我来说已经运行了 4 年多。
我还有几个基于 Microsoft 模式与实践组 (P&P) 的复合应用程序块 (CAB) 构建的应用程序。是的,我知道这真的很老了,但我是一名兼职开发人员,一个人的商店,无法更新到当前的框架。
这就是我的问题所在:我一直在锻炼我的 OO 设计技能,每当进行大量重构时,我都会尝试从程序方法转变为更 OO 的方法。当然,OO 设计的一个主要方面是将操作放置在它们使用的数据附近,这意味着我的 ORM 对象需要在适当的地方添加功能。当我还考虑到我在 CAB 中使用 P&P 的 Object Builder DI 容器并且我将移动到我的 ORM 对象中的大部分功能都需要访问我的应用程序公开的服务时,这证明是一个真正的难题。
换句话说,假设我有一个名为“Person”(我知道是原始的)的共享业务对象,并且我有两个应用程序与一个人做完全不同的事情。应用程序 A 提供了一组服务,Person 对象需要对这些服务进行 DI,以便它采用当前在我的服务层中散布的一些方法。应用程序 B 还具有一组不同的服务,IT 需要将其 DI 到人员对象中。
考虑到 P&P 对象构建器如何使用属性修饰和类型反射来解决依赖关系,我不知道如何实现这一点。简而言之,我有一个共享对象,当在各种应用程序中使用它时,我需要注入依赖项,以便它可以执行特定于该应用程序的某些操作。
我能想到的唯一方法是从 Person 对象继承 Application A & B 中的新类型。然后,我会将我的非共享功能和 DI 代码添加到这个特定于应用程序的专用 Person 对象中。既然我写了它似乎很明显,但这仍然是我能想出的唯一解决方案,我想在这里问一下是否有其他人想提出不同的解决方案?
我的解决方案会遇到的一个问题是,我可以看到自己正忙于命名我的继承类型 - 我的意思是......它是一个人,那么你还会怎么称呼它?无论如何,希望你能给我一些想法。
另外,我对现有的技术并不感兴趣,说实话,我只是勉强掌握我目前使用的技术。因此,如果我说了一些自相矛盾或令人困惑的话,我希望您能从帖子的其余部分中充分理解,以了解我的要求。
【问题讨论】:
-
为了确保我理解,由自定义属性引起的耦合是主要问题?
-
虽然您可以将实现放在接近 OO 中的数据的位置,但我不确定这是否是良好 OO 设计的要求。事实上,有时这是个坏主意。
-
@Brook 我认为问题实际上是我正在尝试做的事情是不可能的(或明智的)!我试图找到一种方法来向共享对象(“人”)添加功能,而不会将对象耦合到特定于应用程序的(非共享)接口。当然,我需要将 Person 对象耦合到它需要的接口。
-
虽然这可能被认为是滥用 SRP,但有时为公共对象制作特定于应用程序的扩展方法非常方便。
标签: c# oop orm dependency-injection