【问题标题】:Some questions about using Code First, Repository Pattern and n-Tier?关于使用 Code First、Repository Pattern 和 n-Tier 的一些问题?
【发布时间】:2012-04-14 08:30:06
【问题描述】:

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

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

希望有人能给我一些指导。

【问题讨论】:

  • 这个问题听起来像流行语宾果游戏:)

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


【解决方案1】:

您在谈论存储库和聚合根,所以我假设您说您想做 DDD。 在 DDD 中,您应该有一个域模型,该模型应该是您与系统用户一起开发的模型。在任何情况下,它都应该包含普通用户应该理解的概念。 因此,如果用户将博客视为具有关联文件的东西,并且这些文件可以添加到博客中,那么关联文件属于您的域模型,并且您的博客对象应该有一个 add 方法。 我的猜测是您的 BLL 是您要放置这些关联文件的位置。

【讨论】:

    【解决方案2】:

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

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

    public interface IBlogFilesRepository
     {
         void Save(Blog);
     }
    

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

    【讨论】:

      【解决方案3】:

      我认为您的意思是 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,他可以添加新的文件(未上传的)文件来发布吗?他能把这些东西混在一起吗?这些都是重要的问题,您需要再次考虑并设计您的系统。

      【讨论】:

      • 好的,我现在知道该怎么做。我只是通过博客 repo 添加和删除 AssocFiles,因为这本质上是聚合路由
      猜你喜欢
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      相关资源
      最近更新 更多