C# DAL课程应该公开吗?

C# DAL课程应该公开吗?,c#,class,architecture,interface,C#,Class,Architecture,Interface,假设我有一个DAL,多个应用程序使用它访问相同的数据。DAL定义了自己的类和接口来处理这些数据,但是使用DAL的应用程序应该使用这些类,还是只使用接口 另一种方式;如果是: List<Product> products = MyDAL.Repository.GetProducts(); List products=MyDAL.Repository.GetProducts(); 或: List products=MyDAL.Repository.GetProducts(); 使用

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

另一种方式;如果是:

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

List products=MyDAL.Repository.GetProducts();

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

为了确定最佳方式,这里有太多的问题

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

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


如果应用程序明确地不希望类提供的功能,而是希望提供自己的实现,那么只需使用接口即可

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



这实际上是一个如何使用所讨论的类的问题。

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

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

例如,如果使用DAL的某个应用程序希望稍微更改产品的行为,该怎么办?如果原始类是私有的,如何对其进行子类化或修饰


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

为什么应用程序需要有自己的实现细节?它可以通过(公共)接口使用DAL定义的(私有)实现。这比IPProduct而不是Product更可能导致问题。Ian,等,谢谢,但请记住上面的代码仅用于说明目的。我建议您返回IQueryable而不是List。paolo,您是否认为您是在为具有虚拟成员的公共类辩护?@Robblynn是的,我会,尽管IoC容器和装饰器模式的组合使得组合行为更容易,并且不需要方法是虚拟的。
List<IProduct> products = MyDAL.Repository.GetProducts();