【问题标题】:Should DAL classes be public?DAL 课程应该公开吗?
【发布时间】:2025-12-20 09:10:12
【问题描述】:

假设我有一个 DAL,多个应用程序使用它来访问相同的数据。 DAL 定义了自己的类和接口来处理这些数据,但使用 DAL 的应用程序应该使用这些类还是只使用接口?

另一种方式;应该是:

List<Product> products = MyDAL.Repository.GetProducts();

或:

List<IProduct> products = MyDAL.Repository.GetProducts();

每个使用 DAL 的应用程序都必须为 Product 创建自己的实现细节是好是坏?

【问题讨论】:

  • 为什么应用程序需要有自己的实现细节?它可以通过(公共)接口使用 DAL 定义的(私有)实现。
  • 其实我上面最大的问题是使用List而不是IList。这比 IProduct 而不是 Product 更容易引起问题。
  • Ian 等人,谢谢,但请记住,上面的代码仅用于说明目的。

标签: c# class architecture interface


【解决方案1】:

传递接口而不是类是一件(非常好的)事情。将您的 DAL 类设为私有是另一回事(不一定是好事)。

例如,如果使用 DAL 的应用程序之一想要稍微改变 Product 的行为怎么办?如果它是私有的,你如何子类化或装饰你的原始类?

假设您的一个应用程序是一个 Web 应用程序,它需要将产品的图像存储为 url 而不是文件路径?或者在 Product 之上添加缓存、日志记录或其他东西?

【讨论】:

  • paolo,你是说你是在为虚拟会员的公共课程辩护吗?
  • @RobGlynn 是的,我愿意,尽管 IoC 容器和装饰器模式的组合使组合行为更容易,并且不需要虚拟方法。
【解决方案2】:

为了确定最佳方法,这里有太多问题。

如果这些应用程序可以重用 DAL 中的类提供的附加功能,那么我会说绝对重用它们。

以“产品”为例。如果 DAL 的 Product 定义与应用程序所需的定义非常接近或相同,那么重用是您的最佳选择。


如果应用程序明确不想要类提供的功能,而是想要提供自己的实现,那么只需使用接口。

再看一下“产品”:如果应用程序有自己的产品定义,可能还有其他或只是简单不同的属性和方法,那么它们应该实现接口。


这真的是一个关于如何使用所讨论的类的问题。

【讨论】:

    【解决方案3】:

    返回接口更好,但是您需要 GetProducts() 来了解这些实现以正确查询数据存储。您可能希望为此使用 IOC 框架。

    【讨论】:

    • 我建议你返回 IQueryable 而不是 List。