我在工作中的mvc3项目中使用了dapper,并且很喜欢它。然而,当使用dapper时,应该如何分层应用程序呢?目前我只是将所有的sql直接放在控制器中( slap ),但我正在考虑创建一个具有静态字符串的类。这样我就可以做到
var reports = Dapper.Query<Report>(conn, MySql.ReportsRunningQuery)
当使用Dapper时,你如何存储你的SQL语句?
我在工作中的mvc3项目中使用了dapper,并且很喜欢它。然而,当使用dapper时,应该如何分层应用程序呢?目前我只是将所有的sql直接放在控制器中( slap ),但我正在考虑创建一个具有静态字符串的类。这样我就可以做到
var reports = Dapper.Query<Report>(conn, MySql.ReportsRunningQuery)
当使用Dapper时,你如何存储你的SQL语句?
我建议将 SQL 语句放在你本来会放 LINQ 查询或 DataContext.ExecuteQuery 的地方。至于具体在哪里放... 呃,这取决于你需要多少分离。
然而,就个人而言,我认为把 SQL 隐藏在与 Query<T>
调用不相关的单独类中是没有好处的 - 你希望在上下文中看到它们,以便可以轻松验证数据(以及参数)。你也可能在现场构建查询(仍然是参数化的)。但对于常规的静态查询,除非有 很好的理由 需要将其抽象化,否则我会把 TSQL 作为文字直接保留在代码附近。
var reports = conn.Query<Report>(@"
select x.blah, y.blah
from x (snip)
where x.ParentId = @parentId and y.Region = @region", new {parentId, region});
(注意上述中的替代扩展方法的用法)
在我看来,上面的关键是你几乎不可能从任何其他地方重新使用那个查询 - 逻辑应该放在一个方法中,并从多个地方调用该方法。因此,隐藏查询查询背后的唯一其他原因是如果需要支持不同的数据库提供程序(具有不同的SQL语言版本)。而这种情况比人们想象的要少。
using Dapper;
的命令。 - Marc Gravell使用资源文件对我们非常有用。我们在名为/Sql的文件夹中创建.sql文件,并将它们拖到SqlResource对象的“文件”部分中。资源文件的“字符串”部分非常干净,适合较小的SQL片段(例如我们可能正在查询的函数)。
因此,我们的SQL看起来像:
var reports = conn.Query<Report>(SqlResource.Blahs_get, new {parentId, region});
这样可以保持存储库的干净整洁。将所有SQL放入资源文件中还有其他好处,您可以遍历条目并可能使用PARSEONLY查询数据库,以确保如果数据库对象更改,您的查询会中断(请注意,这主要但不完全可靠)。
因此,总之,对我们而言,资源文件使事情变得真正干净整洁,但根据Marc Gravell的观点,它们不适用于生产代码内的可重用性……每个SQL语句只应由应用程序中的一个点使用。
SQL.Filename
在我的代码中的任何位置获取查询。 - Christian Wattengård