我知道在这里应该有一个被实现的接口等,但今天我无法理解它。
编辑:目前(即此应用程序的当前版本)我只使用普通的SQL Server(甚至是2000),仅使用存储过程进行数据访问,但我不反对添加一层灵活性以使用Linq to SQL或其他内容。
编辑#2:我想要补充一件事情:我将根据数据库的V1编写代码,并且需要能够让我们的DBA重新设计数据库并在以后给我V2,因此最好只更改一些小细节,而不是必须重新编写整个DAL。
我已经完成了几个MVC应用程序,并找到了一种非常适合我的结构。它基于JPrescottSanders提到的Rob Conery's MVC Storefront Series(尽管他发布的链接是错误的)。
所以,我通常尝试将控制器限制为仅包含视图逻辑。这包括检索要传递给视图的数据以及从视图传回的数据映射到域模型。关键是尝试将业务逻辑排除在此层之外。
为此,我通常会在应用程序中使用3个层。第一个是表示层-控制器。第二个是服务层-该层负责执行复杂查询以及诸如验证之类的事情。第三层是存储库层-该层负责所有对数据库的访问。
所以在你的产品示例中,这意味着你将拥有一个ProductRepository,其中包含GetProducts()和SaveProduct(Product product)等方法。你还将拥有一个ProductService(依赖于ProductRepository),其中包含GetProductsForUser(User user),GetProductsWithCategory(Category category)和SaveProduct(Product product)等方法。像验证之类的事情也会在这里发生。最后,你的控制器将依赖于你的服务层来检索和存储产品。
你可以跳过服务层,但通常会发现你的控制器变得非常臃肿,往往做太多的事情。我已经尝试过这种架构很多次,它往往运行得非常好,特别是因为它非常支持TDD和自动化测试。
我认为Billy McCafferty的S#arp Architecture是一个非常好的例子,展示了如何使用ASP.NET MVC与数据访问层(默认使用NHibernate)、依赖注入(目前使用Ninject,但计划支持CommonServiceLocator)和测试驱动开发。该框架仍在开发中,但我认为它相当不错且稳定。在当前版本中,应该不会有太多破坏性变化,直到最终发布之前,所以对其进行编码应该没问题。
我认为你需要一个ORM。
例如Entity Framework(Code First)。
你可以创建一些用于模型的类。
使用这些模型来处理逻辑和视图,并将它们映射到数据库(v1)。
当DBA提供新的数据库(v2)时,只需更改映射配置即可(v1和v2都是关系型数据库,如SQL Server、MySQL、Oracle等)。如果DB(v1)是关系型数据库,而DB(v2)是NoSQL数据库(如Mongo、Redis、Couchbase等),那么就无法工作。
可能需要进行一些查找和替换。
对于我们的应用程序,我计划使用LINQ to Entities,但由于这对我来说是新的,如果它的性能不如我所愿,我可能会想要将其替换为其他东西,比如LINQ to SQL或NHibernate,因此我将把数据访问对象抽象成一个抽象工厂,以便实现对应用程序的隐藏。
你如何做取决于你,只要选择一个经过验证和广为人知的设计模式进行实现,我认为你的最终产品将得到良好的支持和稳健性。
我刚刚完成了我的第一个MVC项目,使用了Service-Repository设计模式。现在网络上有很多关于它的信息。这使得我从Linq->Sql到Entity Framework的转换变得轻松。如果你认为你会经常更改,请花费一点额外的努力来使用接口。
我建议您使用Entity Framework作为您的DAL/Repository。