【问题标题】:Why should a data access layer be abstracted? [closed]为什么要抽象数据访问层? [关闭]
【发布时间】:2012-12-18 17:37:51
【问题描述】:

当没有任何实现细节可用于当前代码范围时,应使用接口。

当您可以获得一些实现细节时,应该使用摘要。

查询 - 为什么仍然需要这些术语?为什么业务对象不能直接与 DataAccess.SqlServer 层通信?

【问题讨论】:

  • 更好的分层、更好的抽象、更松散的耦合——我需要继续吗?
  • 对不起,伙计...这对意见太开放了...您可能会因为问题过于开放而关闭它...但是对于 duffymo 来说,松散耦合是主要原因...如果您要问这个问题,我怀疑您从未经历过大型项目重构的地狱。
  • 我认为你的问题更适合programmers.stackexchange.com
  • 无论如何,将所有代码放在一个大对象中。是什么阻止了你?
  • @Rikon 够公平的。感谢您的解释。如果现在是个好问题,那么投票重新打开它怎么样?

标签: c# asp.net oop c#-4.0 c#-3.0


【解决方案1】:

当没有任何实现细节时应使用接口 可用于当前代码范围。

不是真的。你指的是封装。有“信息专家”的概念。只有知道如何做某事的班级才能做这件事。接口用于多态性和解耦。当使用代码希望以相同的方式处理某些类型的对象时,该代码可以通过将所有这些对象视为接口类型来以相同的方式使用它们。

当一些实现细节不明确时,应该使用摘要 可供您使用

我不确定你在这里的意思。我认为你很困惑,因为这听起来不对。抽象类的使用方式与接口相同,但允许在其中实现。

查询 - 为什么仍然需要这些术语?为什么不能业务对象 直接与DataAccess.SqlServer层通信?

他们可以,但以可维护性、灵活性和可测试性为代价。如果你想用另一个替换你的数据层,你不能因为消费代码直接依赖于当前数据层。如果你想对你的逻辑进行单元测试,你不能不打数据库。如果您将数据库类放在接口后面,您可以在单元测试中模拟数据层并测试您的逻辑类而无需访问数据库。

非常简短的示例

public Foo FooLogic
{
    IFooData fooData = DataAccessFactory.GetDataClass<IFooData>();
    return fooData.GetFoo();
}

现在您的逻辑类不再绑定到特定的数据类。工厂可以返回一个真正的 FooData 实现,也可以返回一个模拟数据对象,或者可以在不影响逻辑类中的代码的情况下放置一个新的数据访问层。

【讨论】:

  • +1。你能为最后一段举一个非常简短的例子吗?
  • @ytftyffty 完成。希望对您有所帮助。
  • @abcdefghi 这对你有帮助吗?
  • 没有。我无法理解添加它的真正原因。
猜你喜欢
  • 2011-07-15
  • 2011-02-19
  • 2012-12-01
  • 1970-01-01
  • 2012-03-30
  • 2010-09-08
  • 1970-01-01
  • 2013-12-05
  • 2019-07-24
相关资源
最近更新 更多