【问题标题】:VB.net / C# dont reference sqlreader in client portion then where?VB.net / C# 不要在客户端部分引用 sqlreader 那么在哪里?
【发布时间】:2009-10-30 12:33:40
【问题描述】:

假设我有一个包含 5 个文本框的表单,我需要从数据库中提取一些数据,然后使用该数据设置这 5 个文本框。

所以假设我有 3 个基本层:

  • default.aspx 页面背后的代码

  • 联系 DAL 的 BLL 类

  • 和数据访问层 (DAL)

但我听说default.aspx页面不应该知道sqldatareader,实际上你可能不想将sqlclient命名空间添加到default.aspx代码隐藏页面。

所以我曾经做过这样的事情:

protected sub DisplayCustomerData()

Dim s as SqlDataReader
Dim b as BLL

b=new BLL();
s = b.GetCustomerData();

//then take s and simply set each text field
if s.read()
TextBox1.Value = s("MyField1")
end if
end sub

然后 BLL 将简单地调用 DAL 来调用 SQL Server 中的存储过程并执行 CommandObject.ExecuteReader,将结果传递回 BLL,然后 BLL 会将其发送到 default.aspx 的代码隐藏页面。

如果这没有意义,我可以提供完整的源代码。我的问题是,如果 default.aspx 实际上声明并知道 SQL 数据读取器是不好的,那么更好的方法是什么?我应该使用什么数据类型来避免在我的接口代码中使用 sqldatareader?

【问题讨论】:

    标签: asp.net vb.net sqldatareader


    【解决方案1】:

    您已经引入了多个层,但实际上并未分离关注点。通过在您的前端使用 SqlDataReader,它需要太多关于如何检索数据的知识。

    通常您会有一个包含检索到的数据的客户Business ObjectData Transfer Object。您的 DAL 将返回 Customer 类型的对象,而不是对 SqlDataReader 的引用。

    protected sub DisplayCustomerData()
    
        Dim customer as Customer
        Dim b as BLL
    
        b=new BLL();
        customer = b.GetCustomerData();
    
        If Not customer is Nothing Then
            TextBox1.Value = customer.MyField
        End If
    end sub
    

    更新:

    在你的例子中你称之为 BLL,实际上并没有做任何事情。只有数据访问和该数据的呈现。 DAL 本身构建 Customer 对象。

    您使用b 的方式,确实是Data Access Object。它与业务逻辑没有任何关系。业务逻辑类似于根据过去的订单确定该客户获得的折扣百分比。

    【讨论】:

    • 好的,我有点明白了,但是您是否可以在答案中添加 b 对象如何调用 GetCustomerData,这个对象是否正在访问 DAL?我认为只有 BLL 应该访问 BLL?
    • 通常,层只访问它们正下方的层。 UI 层将访问应用程序逻辑层,后者将访问数据访问层。
    • 对,但您是说应用程序逻辑层将调用 DAL,而 DAL 作为回报将返回客户对象?还是 DAL 将 SQLDataReader 传递给应用程序逻辑层并在那里设置客户?我认为 DAL 会调用存储过程。在 SQLDataReader 中获取数据,然后在从 SqlDataReader 获取数据后,它会创建一个 New Customer 对象,将客户对象的字段设置为 sqldatareader 返回的字段,然后将客户对象返回给 BLL 依次返回它要接口吗?
    • 数据访问层应该返回一个对象。它不应该泄露任何关于它从 哪里 获取数据的信息,否则它实际上不是一个层。它的工作是完全封装数据访问。
    • @Greg 我明白这一点,但鉴于我从数据库中提取数据,您是否同意我在评论中所说的话。它将调用存储过程,获取数据,将其存储在 sql 数据读取器中,然后创建客户对象,使用来自 sqldatareader 的数据初始化其值,然后返回 BLL,BLL 反过来将客户对象返回给界面?
    【解决方案2】:

    层是关于封装的。多层架构的想法是将关注点分成单独的封装层,例如

    数据访问层

    封装有关如何执行数据访问的所有信息。不接受或返回任何指示如何执行数据访问的类型(即,它不接受或返回数据读取器、数据集或类似的东西)。它的工作是持久化和检索对象。理想情况下,您应该能够将数据访问层替换为具有相同合同但使用完全不同的持久性机制的数据访问层。

    业务逻辑层

    执行业务逻辑功能,无论它们可能适用于您的领域。不关心它如何获取数据,也不知道调用者是否是网站、Web 服务、Windows 窗体应用程序等(即它不处理任何 UI 对象)。

    表示层

    处理内容的呈现,无论是以 API 或网站的形式还是其他形式。如果您以正确的方式编写它,您应该能够拥有多个可以使用您的业务逻辑层的并行表示层。该层不调用数据访问层。


    请注意,对于您使用的实际层结构没有特别要求,它只是一个相当传统的层结构。例如,我们为缓存管理等内容插入额外的层。

    【讨论】:

    • @Greg 谢谢,我完全理解这些想法,我很难通过代码理解它们......我知道层与层,我已经阅读了所有这些主题。只有当我坐下来编写代码时,问题才会开始......
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 2010-11-26
    • 2015-12-06
    • 2016-04-23
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多