【问题标题】:How do I correctly separate the database operations from the gui/logic in c# when working with datasources?使用数据源时,如何正确地将数据库操作与 c# 中的 gui/逻辑分开?
【发布时间】:2010-02-08 23:15:20
【问题描述】:

我很难弄清楚如何为我的问题指定一个好的搜索词:在 Visual Studio 2008 中使用 Linq to sql 分离 gui 和数据库交互。

根据我在 c# 课程中的老师所说,让 GUI 依赖于获取数据的特定方式是不正确的。

我的项目目前的设置方式是我们有一个存储所有内容的 mssql 数据库。 该解决方案分为 4 个单独的项目。 UserGUI、AdminGUI、Logic 和 Db。

现在使用 linq 填充列表框和类似的东西,我使用类似的东西:

来自项目UserGUI中的windows窗体:

//The activeReservationBindingSource has Db.ActiveReservation as it's value
private void refreshReservation() {
            activeReservationBindingSource.DataSource = logic.getActiveReservationsQry();
        }

到逻辑项目:

public IQueryable getActiveReservationsQry() {
    return dbOperations.getActiveReservationsQry(this.currentMemberId);
}

到数据库项目:

public IQueryable getActiveReservationsQry(int memberId) {
            var qry =
             from active in db.ActiveReservations
             where active.memberId == memberId
             orderby active.reservationId
             select active;

            return qry;
        }

这对我来说很有意义,因为我可以将列表框中的项目一直发送到数据库项目,并且可以轻松地将内容更新/插入到 mssql 数据库中。问题是很难从 mssql 数据库合并到一个访问版本。

我应该阅读哪些内容以了解如何正确执行此操作?当我创建 dbml 文件时,创建自己的类是否具有与 Visual Studio 为我生成的值相同的值?然后我应该在逻辑项目中填充例如我传递给 GUI 的列表吗?对我来说,这似乎是“双重工作”,但也许这是正确的方法?

请注意,我们尚未阅读有关设计模式或业务逻辑的任何内容,这似乎是一个相当大的主题,我期待稍后在课程框架之外进行探索。

我还认为 IQueryable 继承自 IEnumerable,也许这是要走的路,但我没有找到任何对我有意义的信息来说明如何实际实现这一点。

GUI 还知道我认为是坏事但不知道如何摆脱的数据源。

请理解,我今天在该项目唯一可用的辅导课上与我的老师尝试了半个小时,然后花了一天的大部分时间试图在谷歌、SO 和同学那里找到类似的答案,但没有任何结果.

【问题讨论】:

    标签: c# linq-to-sql oop


    【解决方案1】:

    有一个帖子here 我回答了其中的问题与您的问题有点相似。我觉得值得一看。

    问候

    【讨论】:

      【解决方案2】:

      一个要阅读的关键字:模型-视图-控制器。这就是你所追求的想法。您的“视图”是 GUI。 “模型”是数据层,控制器是从数据库中获取数据并将其传递给 GUI(反之亦然)的代码。

      【讨论】:

        【解决方案3】:

        查看存储库模式。您可以通过谷歌搜索“Linq 存储库”找到几种实现。

        您可能想在此处查看 MVC Storefront 系列:http://www.asp.net/learn/mvc-videos/#MVCStorefrontStarterKit。在该系列中,Rob Conery 构建了一个 Linq IQueryable 存储库,该存储库返回自定义对象而不是 linq 对象。

        【讨论】:

          【解决方案4】:

          可能你可以看看Data Abstract

          【讨论】:

            【解决方案5】:

            根据我在 c# 课程中的老师所说,让 GUI 依赖于获取数据的特定方式是不正确的。

            老实说,你的老师是个白痴。从数据库的角度来看,这是我读过的最愚蠢的陈述之一。当然,如果这是获取数据的最佳性能方式,您当然希望依赖于获取数据的特定方式(这几乎总是特定于数据库,意味着不使用 LINQ to SQL 进行复杂查询,但这是另一个问题)。用户关心性能而不是数据库独立性。

            很少有现实世界的应用程序真正需要独立于数据库。是的,有几种商业销售的盒装软件是(尽管我认为这通常是一个错误,也是我曾经使用过的每一个商业产品设计糟糕且速度极慢的原因之一)。

            而且由于每个数据库都以不同的方式实现 SQl,即使使用 ANSII sql 也不是完全独立于数据库的。尤其是访问与 ANSII 标准相差甚远。没有办法编写在每个可能的数据库上都能正常工作的代码。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-18
              • 2017-11-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多