【发布时间】:2009-06-22 08:23:45
【问题描述】:
我有一种情况,我试图让我的模型和实现尽可能松散耦合,但是我面临的情况是耦合可能比我想要的更接近。
我有一个“模型”类的选择,所有实现接口。此外,我还有“数据访问”类,它们提供了许多函数,其中之一是将整数查找值解码为其完整的“对象”表示。
在我的模型类中,我想提供对这些解码值的访问,而不需要模型知道数据访问类。
一个简化的例子是:
/// Core classes --
class Car : ICar
{
public int MakeId { get {...} set { ... } }
public IMakeInfo Make { get {...} }
public string Registration { get { ... } set { ... } }
public int CurrentOwnerId { get { ... } set { ... } }
public IPerson CurrentOwner { get { ... } }
}
class MakeInfo : IMakeInfo
{
public string Name { ... }
public int Id { ... }
public decimal Weight { ... }
// etc etc
}
/// Data Access Classes --
class ResolveMake
{
public IMakeInfo GetMakeInfo(int id)
{
// Implementation here...
}
}
如何启用 Car 类以向任何消费类提供 IMakeInfo 对象,而不直接使其知道 ResolveMake 类?在实际实例中,我使用的 Car 类与 ResolveMake 类不在同一个命名空间中,并且它不包含对其任何实例的引用。
我的一些选择:
- 在
Car中实现一个委托,该委托可以提供GetMakeInfo方法的实例。 - 某种依赖注入
- 将 Car 与 ResolveMake 紧密耦合并完成。
- 还有其他选择吗?
欢迎提出任何建议!
【问题讨论】:
-
您能否以某种方式将
ResolveMake实例传递给Car,让它修改该实例并通过调用Make将其返回? -
您在模型中使用接口是否有原因?这通常被认为是一种反模式,例如lostechies.com/blogs/jagregory/archive/2009/05/09/…。
-
@BengtBe - 虽然我同意这确实有反模式的味道,但我给出的示例纯粹是这样,实际情况充分利用了接口和由此产生的抽象。
-
@mikem - 这就是我对委托的想法,(可能是一个接受一个实现的属性,它接受一个 int 并返回一个 IMakeInfo 对象)当然,那么你仍然有实际提供该委托的问题对所有
Car实例起作用.. -
您可以使用针对 .NET2.0 的 C#3.0 编译器吗?在这种情况下,我的编辑应该允许您使用扩展方法...
标签: c# design-patterns .net-2.0 loose-coupling