假设您有三层(业务、数据和UI)。我的数据层将有一个linq to sql
文件,其中添加了所有表。
我已经看到了一些示例,其中在业务层中创建了一个接口,然后在另一个类中实现(类型为 IQueryable/IEnumerable),而其他类则使用普通Linq syntax
来获取/保存/删除/更新数据。
为什么以及何时使用具有IQueryable/IEnumerable
类型的接口?
假设您有三层(业务、数据和UI)。我的数据层将有一个linq to sql
文件,其中添加了所有表。
我已经看到了一些示例,其中在业务层中创建了一个接口,然后在另一个类中实现(类型为 IQueryable/IEnumerable),而其他类则使用普通Linq syntax
来获取/保存/删除/更新数据。
为什么以及何时使用具有IQueryable/IEnumerable
类型的接口?
您可能希望这样做的两种最常见的情况是:
例如,您有一个直接与 LINQ to SQL 对话的业务层。将来您可能需要使用 nHibernate 或实体框架。进行此更改会影响您的业务层,这可能并不好。
相反,如果你已经编写了一个接口(比如 IDataRepository),你应该能够在不必改变你的业务层的情况下换入和换出具体的实现,比如 LINQtoSQLRepository 或 HibernateRepository - 它只关心它可以调用,比如 Add(), Update()、Get()、Delete() 等 - 但不关心这些操作是如何实际完成的。
对接口进行编程对于单元测试也非常有用。由于速度和可靠性等多种原因,您不想针对数据库服务器运行测试。因此,您可以传入测试替身、伪造或模拟实现来测试您的数据层。例如,您有一些实现 IDataRepository 的测试数据,它允许您在没有数据库连接的情况下从业务层测试 add()、delete() 等。
这些要点通常是应用程序各个方面的良好实践。我建议阅读存储库模式、SOLID 原则,甚至可能是测试驱动开发。这是一个很大而且有时很复杂的领域,很难给出一个详细的答案,说明该做什么以及何时需要适合您的场景。
我希望这可以帮助您入门。