我想使用EF Code First。我正在使用存储库模式。我想实现一个n层架构。我真正想要的是使用TDD,但我遇到了聚合路线的问题。我的问题是......
我有一个博客对象。从这个博客对象可以添加相关文件。大。所以我本质上有一个聚合根,我创建了我的存储库,然后我需要添加一些方法,允许我“添加”关联文件到博客。但是我把它放在哪里?它是一个数据访问层的东西,所以我真的想要它。但说实话,它也是一个商业逻辑挑战。该产品的一部分是能够添加关联文件。那么我应该把逻辑添加到DAL或BLL中的Assoc Files吗?
希望有人可以给我一些指导。
答案 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,是否可以添加新文件(未发布)文件发布?他可以混合这些东西吗?这些都是重要的问题,你需要考虑它并设计你的系统。