面向对象设计模式(数据访问)的常见方式是什么?

5

最初有DAL对象,我的BO调用它来获取信息,然后将其传递给UI。然后我开始注意到UI中的代码减少了,并出现了控制器类。这是一个好的建议。

我目前的结构如下:

Public Class OrderDAL

    Private _id Integer
    Private _order as Order

    Public Function GetOrder(id as Integer) as Order

        ...return Order

    End Function

End Class

然后我有控制器类(最近实现了这种风格)

Public Class OrderController

    Private Shared _orderDAL as new OrderDAL

    Public Shared Function GetOrder(id) As Order

        Return _orderDAL.GetOrder(id)

    End Function

End Class

那么在我的应用程序中

My app Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        msgbox(OrderController.GetOrder(12345).Customer.Name)

    End Sub


End app

我最初发现使用共享类时,每次需要获取数据时不必再创建新的DAL实例。

Dim _orderDAL as New OrderDal

_orderDAL.GetOrder(1234)

.....

你的看法是什么?

谢谢


抱歉关于代码的问题。是的,我的应用程序基于订单处理和报告。我所有的数据访问插入、更新、删除、获取都在DALS中。从我的前端应用程序(Winforms)中,我通过控制器类访问DALs,这些类还会做一些其他的事情,比如如果产品没有返回,它会向特定的表单发布消息。问题是,控制器类真的有必要吗?最初,我将所有的工作代码(我的命名)都打包到每个表单上,但是,一些其他的表单有重复的调用,所以使用控制器类和共享函数和子程序,我成功地将它们分离出来。 - Saif Khan
5个回答

4

0

好的,你的应用程序不应该实例化单独的数据访问层,所以你已经控制了这个问题。但是你发布的伪代码真的很难读懂。

问题是,你的数据访问层是什么,有多少内容?这将决定你要做什么。如果你持久化到文件中,那么我认为你写的很好,如果你需要与系统中的其他控制器共享它,可以将项目包装成单例(发抖)。

如果你真的在处理订单并将其持久化到数据库中,我个人认为现在是时候考虑使用ORM了。这些软件包将为您处理CRUM方面,并减少您需要维护的项目数量。

这是我的意见,一旦我看到更好的例子,我保留修改答案的权利。


0

我不是VB开发人员,所以无法详细讨论VB的细节问题,但是:

你正在做一项良好的实践,将GUI/表示层与数据层分离。在GUI事件方法中包含真正的应用程序代码是一种(可悲的也是众所周知的)不良实践。

你的控制器类类似于桥接模式,这也是一个好主意,如果两个层都可以在不知道对方的情况下改变它们的形式。

继续吧!


0

这是一个好的实践 - 特别是当控制器需要执行更多复杂的操作而不仅仅是简单地委托给底层数据访问层时。


0
我以前使用过你的解决方案,唯一遇到的问题是“共享”或“静态”方法不支持继承。当你的应用程序成长时,你可能需要支持不同类型的“OrderControllers”。
理论上支持不同OrderControllers 的既定方法是创建一个工厂:
OrderControllerFactory.ConfiguredOrderController().GetOrder(42);

这里的问题是: "ConfiguredOrderController()" 返回什么类型?因为它必须有静态的 "GetOrder(int id)" 方法--而静态方法不受继承或接口支持。解决这个问题的方法是不在 OrderController 类中使用静态方法。
public interface IOrderController
{
    Order GetOrder(int Id)
}

public class OrderController: IOrderController
{
    public Order GetOrder(int Id)
    {}
}

并且

public class OrderControllerFactory()
{
    public IOrderController ConfiguredOrderController()
    {}
}

因此,你最好使用非静态方法来控制器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接