在哪里放实体相关的方法?

时间:2009-12-29 22:40:25

标签: c# design-patterns oop

Asp.net-mvc,使用nhibernate。

我的vs.net布局就像:

  • / dao(每个实体1个类用于数据库工作,使用存储库)
  • /模型
  • /映射
  • / factory(提供访问每个实体Dao的db工厂)

现在我需要实用方法,不知道放在哪里。

示例:

  • CartItems.cs
  • CartIemsDao.cs

现在说我的方法如下:

IList<CartItem> items = CartItemsDao.GetById(234)

现在我想创建一个方法,从给定的Dictionary<int,CartItem>填充IList<CartItem>。我应该为此创建一个CartItemManager.cs吗?

“服务”类型用于什么?例如CartService.cs

我相信之前有人说'服务'类型类是为Dao等包装多个调用/逻辑。这是什么?

3 个答案:

答案 0 :(得分:1)

有几种样式,你绝对可以创建一个“helper”类型,它具有你需要的所有静态方法,但从API的角度来看,这是不可能发现的。

我会在数据访问对象本身上创建这些静态方法 - 这更容易发现。当然,没有什么可以阻止您将这些静态方法的实现委托给某个内部帮助器类型。

另外作为旁注:我个人并不关心将“DAO”或其他类似标识符附加到类型名称的风格。类型就是它所以我建议你不要使用“DAO”(但这与你的问题无关)。

答案 1 :(得分:0)

我想说你所描述的是一个“服务”,我通常松散地定义为[可能]我可能想要对实体本身并不真正适合的实体的任何操作(实际上,根据定义包括交叉聚合操作)。

要说明一般情况,您需要使用项目上的某个函数将项目列表转换为项目字典,以便派生密钥。

使用.Net泛型键入,您可以为此提供一般服务,它最适合适用于任何其他层可以使用它的基础架构层的实用程序类型的库。

public class CollectionToDictionaryMappingService {
  IDictionary<TKey, TValue> Map<TKey, TValue>(ICollection <TValue> items, Func<TKey, TValue> keyAccessor) 
  {
    var dictionary = new Dictionary<TKey, TValue>();
    foreach (TValue val in items) {
      dictionary.Add(keyAccessor(val), val);
    }
    return dictionary;
  }
}

答案 2 :(得分:0)

我建议从分层架构的角度来看它。

应用图层

这取决于你如何构建应用程序。我通常为DAO和Business / Logic使用两个不同的层。

在信息系统中,逻辑层通常复制DAO的方法,因为实现用例所需的方法是获取数据/更新数据......与DAO层非常相似。但我认为将它们分开是很重要的,因为你可以在逻辑/业务层添加额外的逻辑,比DAO更复杂(或复合)。

列表 - &gt;字典案例

我不知道你是否需要这种业务逻辑方法。如果是这种情况,该方法可能对某些使用它的业务类是私有的。或者它可以是业务层中受保护的帮助程序类的公共方法。

如果情况并非如此,我还是会在商业层发布它。

但是,如果我遵循分层的观点......服务层应该提供实现用例的方法。它是:它应该提供所需的数据结构。在这种情况下:它应该提供字典。

所以:

  • convert方法应该是业务层的私有

  • qstarin 提出的通用转化方法