关于使用Code First,Repository Pattern和n-Tier的一些问题?

时间:2012-04-14 08:30:06

标签: entity-framework tdd repository-pattern n-tier-architecture

我想使用EF Code First。我正在使用存储库模式。我想实现一个n层架构。我真正想要的是使用TDD,但我遇到了聚合路线的问题。我的问题是......

我有一个博客对象。从这个博客对象可以添加相关文件。大。所以我本质上有一个聚合根,我创建了我的存储库,然后我需要添加一些方法,允许我“添加”关联文件到博客。但是我把它放在哪里?它是一个数据访问层的东西,所以我真的想要它。但说实话,它也是一个商业逻辑挑战。该产品的一部分是能够添加关联文件。那么我应该把逻辑添加到DAL或BLL中的Assoc Files吗?

希望有人可以给我一些指导。

3 个答案:

答案 0 :(得分:1)

您正在谈论存储库和聚合根,因此我假设您说要进行DDD。 在DDD中,您应该拥有一个域模型,该模型应该是您与系统用户一起开发的模型。在任何情况下,它应该包括普通用户应该理解的概念。 因此,如果用户将博客视为具有关联文件的内容,并且可以将这些文件添加到博客中,则关联文件属于您的域模型,而博客对象应具有添加方法。 我的猜测是你的BLL就是你要放置那些相关文件的地方。

答案 1 :(得分:1)

首先,在知道有界上下文之前,无法识别聚合根。没有明确的BS,就没有AR。根据上下文,任何对象都可以是AR。我不知道您的域名,因此我认为博客需要添加文件的信息是有效的。因此,添加功能在AR中。

存储库处理与持久性相关的所有内容,即在数据库中保存。在这种情况下,它应该包含一个方法,仅此而已,仅此而已。

public interface IBlogFilesRepository
 {
     void Save(Blog);
 }

您始终将域/业务逻辑放在域/ BL层中。 DAL只处理保存/加载到数据库,它在处理域行为时没有业务(原文如此)。

答案 2 :(得分:0)

我认为你的意思是DDD而不是TDD,因为你所说的在TDD背景下没什么意义。

您需要坐下来思考文件对您的系统意味着什么,是否有任何连接文件和帖子的规则。例如,如果我们删除帖子应该包含哪些文件?我们也删除它们吗?我们可以将“添加”同一文件添加到多个帖子中。您坐下来,思考并收集有关您的文件的知识,然后您决定它是否值得在您的域中引入。

我可以想象一些示例域:

public class Post
{
    private List<File> _files;
    public IEnumerable<File> AssociatedFiles {get {return _files;}}
    public void AssociateFile(File file){//...}
    public void DisassociateFile(File file ){//...}

    //It doesn't delete it just do some logic. Maybe we can't delete this post and need to throw exception or whatever logic you need
    public void Delete()
    {
        foreach (File file in AssociatedFiles) DisassociateFile(file);
    }
}

public class File 
{
    public String Url;
    public DateTime Created;
    public DateTime Modified;
}

public class PostRepository
{
    public void Delete(Post post)
    {
        post.Delete();
        DbContext<Post>.Delete(post); //I Don't remember EF syntax for this
        DbContext.SaveChanges();
    }
}

更新:让我们继续......

在对你的领域进行了5分钟的思考之后,我发现我的初始设计错过了重要的概念(就像DDD一样,你一点一点地抓住了知识)。

谁负责上传文件?用户可以将他已经上传的文件关联到Post,是否可以添加新文件(未发布)文件发布?他可以混合这些东西吗?这些都是重要的问题,你需要考虑它并设计你的系统。