1

我正在使用 SQlite 为 Windows Phone 开发一个应用程序,并且有很多自定义 SQL 查询。喜欢

string query = "SELECT distinct(destinations.name) as Destinations 
                FROM destinations, flights 
                WHERE destinations.d_ID = flights.d_ID 
                AND flights.Date = #" + date.ToShortDateString() + "#";

然后运行:

 var result = (Application.Current as App).db.Query(query);

为了使用 SQlite,我正在使用http://dotnetslackers.com/articles/silverlight/Windows-Phone-7-Native-Database-Programming-via-Sqlite-Client-for-Windows-Phone.aspx#s2-introduction- to-sqlite-client-for-windows-phone 和他们的 DBHelper

我希望所有查询都在一个地方,所以我可以快速更改它们。

想请问如何正确操作?

  • 创建一个静态类
  • 使用查询集合创建枚举或字典
  • 使用集合创建一些 XML 或类似文件 -

感谢您的建议

4

1 回答 1

4

我不认为任何方法都是有效的,原因如下:

创建一个静态类

这是一个上帝对象,被认为是一种反模式,最好远离它。维护这将是一场噩梦。

使用查询集合创建枚举或字典

你现在没有一个上帝对象,而是一个上帝集合,并且实际上只是以不同的方式实现相同的反模式。

此外,您将拥有字符串键(或枚举键),并且两者之间没有强链接(如果字典由于某种原因没有填充怎么办?)。

使用集合创建一些 XML 或类似文件

有人可能会争辩说,您正在做与字典相同的事情。您必须以某种方式键入查询,然后进行查找。这是一种非常脆弱的方法。

可能的解决方案

我建议您首先将数据层抽象为逻辑单元。为相关的数据操作创建一个类。

例如,如果您有一些与目的地相关的查询和操作,请创建一个公开这些操作的接口:

public interface IDestinationDataOperations
{
    // Get destinations by date.
    IEnumerable<string> GetDestinationsByDate(DateTime asOf);
}

然后,创建一个实现此特定于 SQL Lite 的类。在您要进行调用的地方,该变量属于接口类型。

这样做的好处是:

  • 如果您将实现从 SQL Lite 更改为其他一些底层数据存储(Web 服务调用、JSON REST 调用等),您只需更改填充接口变量的位置(这是开始使用依赖注入的位置),如你所有的电话都反对抽象

  • 接口更容易测试:

    • 您可以针对您想要的任何测试数据测试直接实现
    • 对于依赖于接口的项目,您可以以任何您喜欢的方式模拟接口,并且在下面没有用于测试的实际数据库。

然后,对于其他数据操作,您可以清洗、漂洗和重复。

对于奖励积分,您可以将界面分离为写入的工作单元和读取的存储库,具体取决于最适合您的需求。

于 2012-11-28T17:07:45.017 回答