在哪里放置GetItems静态方法? +继承问题

时间:2011-03-22 16:37:09

标签: c# .net design-patterns

我有Item类:

public class Item {
    public long Id {get; protected set;}
    public string Name {get; protected set;}
}

现在我想添加一个根据过滤器从数据库中检索项目的函数。这应该是返回Item []:

的静态方法
public static Item[] GetItems(long? itemId, string itemName) {
    //Do Search in the db for items with Id=itemId (in case itemId is not null) and
    //with Name=itemName (in case itemName is not null)

    return itemsList.ToArray();
}

问题是在哪里放这个方法? 1.我应该为此创建一个新类吗?我怎么称这堂课? 2.我应该把这个方法放在Item类中吗?

另一个问题: 如果我想继承Item类。如何强制子类实现这样的GetItems方法?

4 个答案:

答案 0 :(得分:2)

我建议使用简单的repository pattern实现。您可以创建一个名为ItemRepository的类,它知道您的Item对象和DAL实现。存储库只需调用DAL即可获取所需的任何数据,然后将业务对象返回给使用者。

实现起来非常简单,如果你创建一个与它一起使用的接口(例如:IItemRepository),单元测试变得非常简单,因为你将能够模拟存储库并将其传递任何消耗它的对象。如果你把所有东西都弄得一团糟,那么测试要困难得多,所以我不推荐它。

至于继承:如果要定义应在每个Repository对象上可用的常规方法签名和属性,请使用接口准确指定每个存储库应具有的共同点。如果要提供基本存储库骨架,那么抽象可能更合适。

答案 1 :(得分:1)

对我来说,GetItems(复数)听起来不像应该是Item(singular)的成员。特别是因为物品很简单。我将创建一个名为ItemUtility的静态实用程序类(工厂模式),它具有GetItems。

回答你的第二个问题:如果一个类继承自Item,它也将继承其成员的任何具体实现。因此,如果Item上有一个LoadItem方法,并且我创建了SpecialItem:Item,那么SpecialItem.LoadItem()实际上只是Item.LoadItem()代码。如果你想使Item.LoadItem()可以覆盖,那么你可以在方法上使用“虚拟”修饰符(这将为SpecialItem提供使用该方法做自己的事情的选项)。

如果您只打算将它用作其他更复杂的类(如SpecialItem)的样板基类,则Item也可以是一个抽象类。

另一种选择是创建一个IItem接口,并使LoadItem(以及任何其他所需成员)成为接口定义的一部分。

答案 2 :(得分:0)

数据访问应该在一个单独的类中。遵循Separation of Concerns概念,数据访问应存储在与对象定义不同的层中。

如果要强制所有继承的对象实现方法,可以将其设为抽象。

答案 3 :(得分:0)

您是否有任何特定原因要使该方法保持静态?如果要在子类中继承GetItems方法,则不能将其设置为静态。按顺序回答您的问题:

1)是的。创建一个名为ItemManager的新类,它实际调用DB层来获取Items。这样您就可以将数据访问代码与业务逻辑

分开

2)您应该在Item Class中创建一个方法,该方法调用ItemManager中的方法来获取实际数据。

3)如果您希望子类覆盖方法以提供自己的实现,请将您在步骤2中创建的方法标记为虚拟。如果你想强制它们覆盖并且不需要在基类本身中实现,那么将基类标记为抽象,以便子类必须覆盖它