1

我最近开始在我的服务中实现存储库模式,我遇到了一个小问题,我想提出一些建议。

在我的服务中使用以下代码:

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]
public Policy GetPolicyById(int policyId, int historyId)
{
    // Don't do the if not deleted check here, as we can do it on our Controller.
    // This means we can use this function if we have to access the deleted records.
    return _policy.GetByID(policyId, historyId);
}

这个函数显然是直接从服务接口引用的,.GetByID 方法是我的通用存储库的一部分。

主要问题是:如果我想.Where(a => !a.Deleted)对这个结果集做 a 怎么办。您可以通过我的代码注释看到我的一般想法是什么,但这是“正确”的做法吗,应该在服务级别、控制器(UI)级别完成,还是应该在其中创建函数我的非通用存储库允许此功能?

** 更新 **

这是我的代码的另一部分,在我的策略存储库中:

/// <summary>
/// 
/// </summary>
/// <param name="policyId"></param>
/// <param name="historyid"></param>
/// <returns></returns>
public virtual IEnumerable<Policy> GetPolicies(int take, int skip)
{
    var policies = GetPoliciesHistoryGrouped().Take(take).Skip(skip);
    return policies;
}

/// <summary>
/// Returns all non-deleted (bitDelete) policies (in an expression, not comitted via the database), 
/// grouped by the latest history ID.
/// </summary>
/// <returns></returns>
private IEnumerable<Policy> GetPoliciesHistoryGrouped()
{
    // Group and order by history ID.
    var historyIDs = _context.Policies.Where(a => !a.bitDelete)
                     .GroupBy(a => a.intPolicyId).Select(group => new
                     {
                         PolicyID = group.Key,
                         HistoryID = group.Max(a => a.intHistoryID)
                     });
    var query = (from h in historyIDs
                 join p in _context.Policies on new { h.HistoryID, h.PolicyID } equals new { HistoryID = p.intHistoryID, PolicyID = p.intPolicyId }
                 select p).OrderBy(a => a.intPolicyId);
    return query;
}

这种深度不应该在存储库层,而是在服务层,GetPoliciesHistoryGrouped仍然需要在其中创建和共享功能?记住,.Take 和 .Skip 在分组完成之前不能被调用。

4

1 回答 1

1

你的推理是正确的。这种过滤是应该在服务层完成的业务逻辑。存储库仅包含简单的 CRUD 方法。

于 2012-11-15T16:32:54.800 回答