2

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

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

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

4

3 回答 3

1

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

于 2012-04-14T09:19:39.323 回答
1

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

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

public interface IBlogFilesRepository
 {
     void Save(Blog);
 }

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

于 2012-04-14T13:23:39.407 回答
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,他可以添加新的文件(未上传的)文件来发布吗?他能把这些东西混在一起吗?这些都是重要的问题,你需要再次考虑它并设计你的系统。

于 2012-04-14T09:37:07.520 回答