3

我已经实现了一个 3 层架构,可以在下面的链接中看到

http://geekswithblogs.net/edison/archive/2009/04/05/a-simple-3-tier-layers-application-in-asp.net.aspx

在上面的示例中,它使用 DataTable 作为 sqldatasource 并使用以下代码将其绑定到 gridview。

GridView1.DataSource = Client.GetClients();
GridView1.DataBind();

但是我的数据源不是数据表,它是一个常规的 sqldatasource,您可以在其中编辑、删除和更新。所以我不知道如何将它与我的表示层分开,还是应该真正分开?这是我的sqldatasource的代码:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDbConn %>"
    DeleteCommand="DELETE FROM [OrderDetail] WHERE [RowNo] = @RowNo" InsertCommand="INSERT INTO [OrderDetail] ([FileNo], [PONumber], [MaterialCode], [MaterialDescription], [MaterialCategory], [UnitOfMeasure], [Quantity], [ContainerType], [LoadingDate]) VALUES (@FileNo, @PONumber, @MaterialCode, @MaterialDescription, @MaterialCategory, @UnitOfMeasure, @Quantity, @ContainerType, @LoadingDate)"
    SelectCommand="SELECT * FROM [OrderDetail]" UpdateCommand="UPDATE [OrderDetail] SET [FileNo] = @FileNo, [PONumber] = @PONumber, [MaterialCode] = @MaterialCode, [MaterialDescription] = @MaterialDescription, [MaterialCategory] = @MaterialCategory, [UnitOfMeasure] = @UnitOfMeasure, [Quantity] = @Quantity, [ContainerType] = @ContainerType, [LoadingDate] = @LoadingDate WHERE [RowNo] = @RowNo">
    <DeleteParameters>
        <asp:Parameter Name="RowNo" Type="Int32" />
    </DeleteParameters>
    <InsertParameters>
        <asp:Parameter Name="FileNo" Type="Int32" />
        <asp:Parameter Name="PONumber" Type="String" />
        <asp:Parameter Name="MaterialCode" Type="String" />
        <asp:Parameter Name="MaterialDescription" Type="String" />
        <asp:Parameter Name="MaterialCategory" Type="String" />
        <asp:Parameter Name="UnitOfMeasure" Type="String" />
        <asp:Parameter Name="Quantity" Type="Int32" />
        <asp:Parameter Name="ContainerType" Type="String" />
        <asp:Parameter Name="LoadingDate" Type="String" />
    </InsertParameters>
    <UpdateParameters>
        <asp:Parameter Name="FileNo" Type="Int32" />
        <asp:Parameter Name="PONumber" Type="String" />
        <asp:Parameter Name="MaterialCode" Type="String" />
        <asp:Parameter Name="MaterialDescription" Type="String" />
        <asp:Parameter Name="MaterialCategory" Type="String" />
        <asp:Parameter Name="UnitOfMeasure" Type="String" />
        <asp:Parameter Name="Quantity" Type="Int32" />
        <asp:Parameter Name="ContainerType" Type="String" />
        <asp:Parameter Name="LoadingDate" Type="String" />
        <asp:Parameter Name="RowNo" Type="Int32" />
    </UpdateParameters>
</asp:SqlDataSource>
4

2 回答 2

3

SqlDataSource 不适合 3 层架构。怎么做取决于你。您不必将其分开,但如果您想在这里拥有适当的 3 层架构,您需要在数据层中使用某种具有 CRUD 操作的数据库处理类。

您链接的文章清楚地解释了这一点。如果您不想使用 DataTable,您可以创建自己的 POCO 对象来处理数据,例如

public class Order {... }

您的业​​务层方法如下所示

List<Order> GetOrders(...) {...}

和数据

//CRUD naming convention
List<Order> ReadOrders (...)  {...}
于 2012-09-07T17:47:11.067 回答
2

上面罗兰的回答已经解决了:-

  1. 关于分层架构(假设 DAL / BL / UI 的拆分)如何与使用 SQLDataSource 无关,因为在使用 SQLDataSource 时没有这种分离。
  2. 如何在不使用 SQLDataSouce 的情况下使用 POCO/Datatables 将其分离出来

关于你问题的最后一部分,我会给我 0.02 美元:-

  1. 真的应该分开吗?

好吧,就像最现实的答案一样。这取决于。

这取决于诸如 - 您拥有 3 层架构的主要原因是什么?这种设计的一些优点包括更好的可维护性、更好的可测试性甚至更好的可扩展性。相反,使用 SQLDataSource 可能会加快您的开发速度。

我个人的经验是,由于上述某些原因,分层设计通常是一个更好的主意,因此我通常会避免使用 SQLDataSource,甚至 SQLDataSource 的开发速度优势也可以通过使用 CodeSmith 之类的代码生成器来抵消. 所以,从长远来看,我根本看不到使用 SQLDataSource 的任何好处

于 2012-09-10T04:07:19.847 回答