【问题标题】:Should repositories use objects or primitives?存储库应该使用对象还是原语?
【发布时间】:2011-10-10 20:09:15
【问题描述】:

我注意到,对于我的存储库是否将对象或原语作为参数,或者 CREATE 方法是否只返回一个 int(来自 DB 的 ID)或完整的对象,真的没有押韵或理由。

所以我的问题是,存储库应该传递并返回对象还是原语?你能就这件事给出什么建议?您能分享任何一种方法的陷阱或经验吗?

例子:

public class ProductRepository : IProductRepository
{
                // Pass in the whole object to the repo method...?
    public int Add(Product product)
    {
        // return just the productId...?
    }

                    // Pass in the individual primitive values...?
    public Product Add(string productName, decimal productPrice, string description)
    {
        // return the whole Product object...?
    }
}

如果需要来自多个对象的信息怎么办?当然,从 OOP 的角度来看,最好在这里传递对象,不是吗? (我在这里很厚脸皮......)

public int Add(int merchantId, Product product)
{
    // database call needs merchant info...
}

public int Add(Merchant merchant, Product product)
{
    var merchantId = merchant.ID;
    // database call needs merchant info...
}

【问题讨论】:

    标签: c# oop orm repository repository-pattern


    【解决方案1】:

    通常您会在短时间内(如果您使用多个存储库)看到这是一种模式本身,并且可以在某种基类中重构(用于数据访问)。 但为了做到这一点,您将无法为添加/更新等提供扩展参数(您也不应该 - 只考虑具有 10 多个属性的对象),而只是对象本身的模式。

    所以使用选项 1 ;)

    【讨论】:

      【解决方案2】:

      存储库和工厂是不同的概念。工厂负责创建对象;存储库负责获取在其他地方创建的对象并将它们添加到数据存储中。

      从这个角度来看,存储库不应该负责创建对象,因此没有理由对原始值进行操作。

      【讨论】:

        【解决方案3】:

        存储库适用于实体,而不是原始字段。原始字段通常通过数据访问从实体中提取,数据访问是存储库下的一个抽象级别。因此,要回答您的问题,请始终使用对象 - 您的原始字段是数据访问层的实现细节,并且没有业务作为存储库接口中的参数,除非它们是查询过滤器的一部分。

        【讨论】:

          猜你喜欢
          • 2017-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-13
          • 2015-08-05
          • 1970-01-01
          • 2021-12-26
          相关资源
          最近更新 更多