【问题标题】:ASP.NET Web Forms StructureASP.NET Web 窗体结构
【发布时间】:2014-10-07 16:44:34
【问题描述】:

我们有一个几年前制作的 ASP.NET Web 表单解决方案。该解决方案包含以下几层:

  • 数据访问层:我们可以访问数据的地方,只有几个像这样的程序

    public void execute_NonQuery_sql(字符串 SQL) {...}

  • 数据实体:在这一层中,我们定义了不同的实体和访问数据库的查询。

    public static DataTable sel_links()
    {
        mySQL_DA da = new mySQL_DA();
        string sQuery = "SELECT Id, Name, WebSite, Summary FROM links ORDER BY OrderPos ASC";
        return da.get_DataTable_sql(sQuery);
    }
    
  • 数据逻辑:我们在其中调用过程并返回对象。

    public List<LinksDN> sel_links_web()
    {
        try
        {
            using (DataTable dt = LinksDA.sel_links_web())
            {
                List<LinksDN> ListElements = new List<LinksDN>();
    
                foreach (DataRow dr in dt.Rows)
                {
                    LinksDN Element = new LinksDN(dr);
                    ListElements.Add(Element);
                }
    
                return ListElements;
            }
        }
        catch (Exception e)
        {
            throw e;
        }
    }
    
  • 表示层:我们有网页的地方。我们调用了逻辑层的所有程序。

现在我们正在开发一个类似的应用程序,但我们想使用实体框架和模型绑定。 我们正在使用 Visual Studio 2013 Web Forms Framework 4.5 进行开发。

我们过去写了很多代码,但现在我们发现更容易了,因为有了 EF,我们不必再写那么多代码了。

但我们仍有几个问题:

1) 我们如何构建应用程序?我们需要创建不同的项目作为层吗?

我们已经看到,我们不需要有访问数据的过程,因为 EF 会处理这些。那么 2 层是否足够,一层用于模型,另一层用于业务逻辑(当然还有表示层)?

2) 使用EF的时候,是否需要dispose DbContext? 我们看过这个例子,对吗?

public class LinksBL
{
    ObjectDbContext db = new ObjectDbContext();

    public List<links> GetLinks()
    {
        return db.links;
    }

    public List<links> GetLinks()
    {
        return db.links;
    }

    public links GetLink([QueryString("id")]int? LinkId)
    {
        return db.links.Find(LinkId);
    }
}

3) 另外,如果实体链接(例如)有很多属性,即使您不使用它们,您是否总是返回所有属性?

我们可能有一个列表只需要 3 个属性,而另一个列表需要所有属性。我们是否必须创建 2 个不同的过程,每个过程一个,并且只返回我们将要使用的属性? 如果是,我们怎样才能只返回几个属性?

问题可能太明显了,但我们曾经开发过不同的方式,而 EF 对我们来说是新的。 感谢您的帮助。

【问题讨论】:

  • 一方面,摆脱那些 try/catch 块。他们所做的只是弄乱堆栈跟踪,因此您无法确定异常的真正来源。
  • 根据您是先执行模型还是先执行代码,您可以在实体上设置属性以表示忽略此列,或向 EF 提供有关如何处理每一列的其他提示。
  • 约翰,使用 catch { throw; 是否正确? } 并在它们冒泡后在页面级别处理异常?

标签: asp.net entity-framework webforms


【解决方案1】:

1) 我们如何构建应用程序?我们需要创建 不同的项目作为层?

如果你问 10 个人,他们会回答 10 个不同的答案。

查看NopCommerceOrchardUmbraco 等开源项目。 (都是 MVC,现在很难找到 Web Form 项目)。

最近,我阅读了ASP.NET Web API 2: Building a REST Service from Start to Finish。它解释了如何逐步创建项目结构。 (虽然它是为 Web API 编写的,但您将了解项目的布局方式。)Here is the source code

2) 使用EF的时候,是否需要dispose DbContext?我们已经看到 这个例子,对吗?

您不想在服务类中实例化 DbContext。相反,您想使用 IoC 容器注入依赖项。

此外,您不希望像在方法参数中那样在数据库层中调用 HttpContext 对象。

仅供参考: 您的情况与Dependency Injection in .NET book Chapter 2 非常相似。在书中,Mark Seemann 解释了紧耦合问题,以及如何使用依赖注入来解决。

3) 另外,如果实体 Links(例如)有很多属性,请执行 你总是返回所有的属性,即使你不使用它们?

有些人喜欢从服务类而不是 IList 或自定义集合返回 IQueryable。 如果是 IQueryable,则只能检索所需的属性。

其他想法

如果是新项目,我建议使用 ASP.Net MVC 而不是 Web Form。原因是您无法对 Web 表单进行单元测试,并且很难在 Web 表单中注入依赖项。

更新日期:2014 年 10 月 8 日

我们一直在使用 WebForms 进行开发,应用程序相当 复杂的

我明白了。但是,类库的层级基本相同;只有表示层不同。主要概念是您应该能够将 Web 表单、WPF、MVC、Web API 添加到现有解决方案中,而无需更改类库中的任何内容。为此,您需要注入依赖项而不是紧密耦合(您仍然可以在 Web 窗体中实现依赖项注入)

我忘了提到的是你想通过存储库访问 DbContext。也就是说,Service 层不需要知道你使用的是什么类型的数据库。

查看答案 1 中的那些开源项目。

【讨论】:

  • 谢谢 Win,我们意识到使用 MVC 而不是 WebForms 可能会更好,但是我们一直在使用 WebForms 进行开发,并且应用程序非常复杂(许多网格、选项、文件上传......) ,这是一个超过200页的自定义cms...您能根据MVC应用程序回答问题吗?会一样吗?
  • 感谢 win,我正在研究 MVC 的工作原理,我们决定是否采用该选项...我们也将提出一些与 MVC 相关的问题。非常感谢。
猜你喜欢
  • 2017-10-10
  • 1970-01-01
  • 2012-07-06
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
相关资源
最近更新 更多