为什么要抽象数据访问层?

Pan*_*kaj 0 c# asp.net oop c#-3.0 c#-4.0

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

当您可以使用某些实施细节时,应使用摘要.

查询 - 为什么还需要这些条款?为什么Business对象不能直接与DataAccess.SqlServer Layer通信?

Bob*_*orn 6

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

并不是的.你所指的是封装.有"信息专家"的概念.只有知道如何做某事的班级才应该是这样做的.接口用于多态和解耦.当消费代码想要以相同的方式处理某些类型的对象时,该代码可以通过将它们视为接口类型来以相同的方式使用所有这些对象.

当您可以使用某些实施细节时,应使用摘要

我不确定你的意思.我觉得你很困惑,因为这听起来不对.抽象类的使用方式与接口相同,只是允许它们在其中实现.

查询 - 为什么还需要这些条款?为什么Business对象不能直接与DataAccess.SqlServer Layer通信?

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

很短的例子

public Foo FooLogic
{
    IFooData fooData = DataAccessFactory.GetDataClass<IFooData>();
    return fooData.GetFoo();
}
Run Code Online (Sandbox Code Playgroud)

现在,您的逻辑类与特定数据类无关.工厂可以返回一个真正的FooData实现,或者它可以返回一个模拟数据对象,或者可以放置一个新的数据访问层而不会影响逻辑类中的代码.