这里建议采用什么设计模式?

时间:2009-05-19 11:30:50

标签: design-patterns oop

我有2个表,现在作为示例,ClientOrder和Products Table。使用Linq,我已经能够编写我想要运行的所有查询 1.按客户订单搜索 2.按客户名称搜索 3.按产品名称搜索 4.按产品ID搜索

我想为每个上述查询创建方法。的?是什么模式适合这里?工厂模式似乎不符合要求,因为我知道我的每个对象都将使用相同的数据上下文。

使用4种静态方法创建静态类是否更明智?

注意:我在编程世界和新手中已经有5个月了

5 个答案:

答案 0 :(得分:2)

如果您不知道应该使用哪种设计模式,最好不要使用!在这个非常简单的情况下,我无法想象任何设计模式可以提供任何有用的添加。也许您只想知道如何实现控制这四个查询及其结果的函数?

答案 1 :(得分:2)

我发现Martin Fowler的Patterns of Enterprise Application Architecture有助于学习人们如何构建对数据库表的访问。列出了其中一些模式here

对于更简单的任务,使用四种静态方法的单个类听起来非常合理。但是你应该考虑Fowler的表数据网关模式,在这种模式中,你将每个表的所有访问权限打包在它自己的静态方法类中(并使用标准的命名约定)。

答案 2 :(得分:2)

首先,让我们回顾一下Factory方法模式的意图:

  

定义用于创建对象的接口,但让子类决定   要实例化的类。工厂方法允许班级推迟   实例化到子类。

它适用于您的问题吗?您更关心的是如何管理查询而不是创建域对象。

恕我直言,我会避免涉及静态类/方法的任何实现替代方案: 您不能从静态类继承,因此限制了模型的可扩展性。非静态类中的静态方法也是如此:它们不能在子类中重写。

我也不会将这些查询方法添加到您的域对象中。请记住,您正在使用OOP来模拟现实世界,请求订单搜索其他订单是否有意义?

让我们想一想:在现实世界中,您使用订单从中获取特定信息(其日期,客户名称或涉及的产品)。当您想要查找订单时,无论您在哪里存储它们并查找它(例如,在文件柜中)。也就是说,您不使用订单来搜索其他订单。

考虑到这一点,您需要在软件中模拟这种情况。您已经拥有了对订单和产品进行建模的对象。您缺少的是一个对象,用于对用于存储订单和搜索订单的地点进行建模。

通常,这些类型的对象(保存或检索其他对象)称为存储库。在您的情况下,它可以命名为ClientOrderRepository。 这个对象会做什么?好吧,你已经提到过:执行你需要的四个不同的查询。让我们看看它的界面可能的定义:

public interface IClientOrderRepository {
    ClientOrder FindOrderWithIdMatching(int anOrderId);
    ClientOrder FindOrderWithClientNameMatching(string aClientName);
    ClientOrder FindOrderWithProductNameMatching(string aProductName);
    ClientOrder FindOrderWithProductIdMatching(string aProductId);
}

如果您只需要一个实现此接口的类实例,则可以使用Singleton模式。不要依赖于以后难以改变的实现选择(如静态方法)。

最后,即使您找到解决问题的特定模式,考虑对象以及他们协作完成任务的方式也是一种很好的做法。使用现实生活中的隐喻来帮助您找到需要实现的缺失对象或责任。最后,它完全是面向对象范式的本质。

有关存储库模式的更深入信息,以下是一些可以帮助您入门的资源:

答案 3 :(得分:1)

我建议使用静态方法扩展类。如下所示。

IEnumerable<Client> Client.GetByName(String Name) { }

IEnumerable<Product> Product.GetByName(String Name) { }

Product Product.GetById(Guid Id) { }

我假设您使用LINQ to SQL或LINQ to Entity,因此您可以简单地扩展生成的部分calsses。如果您返回集合或实例,并且选择IEnumerableIQueryableIListList或其他任何内容,则会根据您的需要进行选择。

答案 4 :(得分:0)

我可能会将方法作为实例方法用于简单的类(可能是单例),并将其称为数据访问层。实例化所需的数据库,并在适当的方法中只需LINQ我需要的东西。