DAL,服务层和存储库之间的混淆

时间:2011-10-17 16:17:53

标签: asp.net-mvc domain-driven-design repository extension-methods

假设我有一个像这样的简单模型(一个相当大的应用程序的一小部分)

public class EHR : IEntity
{
    public int ID { get; set; }        
    public string UserName { get; set; }
    public DateTime CreationDate { get; set; }
    public virtual ICollection<PhysicalTest> PhysicalTests { get; set; }
}

public class PhysicalTest : IEntity
{    
    public int ID { get; set; }    
    public virtual EHR Ehr { get; set; }
    public Boolean IsDeleted { get; set; }
}

我想要一个简单的方法来获取给定EHR未被删除的physicalTests。

所以,我可以想到三种方法。

一个只是在我的EHR课程中添加一个方法。(它似乎不是一个坏主意因为我不想受anemic domain model

public IEnumerable<PhysicalTest> ActivePhysicalTests()
{
    return this.PhysicalTests.Where(!m=>m.IsDeleted).ToList();
}

另一个是在EHRRepositoryExtensions类下创建一个扩展方法:

public static class EHRRepositoryExtensions
{
    public static IEnumerable<PhysicalTest> Active(this IEnumerable<PhysicalTest> physicalTests)
    {
        return physicalTests.Where(test => !test.IsDeleted).OrderByDescending(test => test.CreationDate).ToList();
    }
}

我还认为我可以扩展我的IRepository以包含一个只返回未删除的physsicalTests的方法。

类似

public class EHRRepository : IRepository<EHR>
{
    //TODO: method that returns only the physsicalTests that arent deleted.
}

我仍在尝试掌握DDD的许多概念,我希望它尽可能纯净。

您会推荐哪种方法? 关于这样的话题的经验法则是什么?

请帮助。

1 个答案:

答案 0 :(得分:0)

建议使用第一种方法,因为EHR是您的聚合根,它是有关其物理测试的信息专家。

第二种方法不相关,因为您已经有了模型,您可以将此方法添加到实体中。

仅当物理测试列表需要花费大量时间从数据库加载时,第三种方法才会更受欢迎,但仍然可以使用延迟加载但是如果要将获取与域分开,或者您不使用延迟加载然后ORM将其作为查询方法放在存储库中