存储库应该使用对象还是原语?

时间:2011-10-10 20:09:15

标签: c# oop orm repository repository-pattern

我注意到,我的存储库是否将对象或基元作为参数,或者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...
}

3 个答案:

答案 0 :(得分:5)

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

所以使用选项1;)

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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