2012-04-14 66 views
2

我想使用EF Code First。我正在處理存儲庫模式。我想實現一個n層體系結構。我真正想要的是使用TDD,但是我遇到了聚合路由的問題。我的問題是這樣的...有關使用Code First,Repository Pattern和n-tier的一些問題?

我有一個博客對象。從這個博客對象中可以添加關聯的文件。大。所以我本質上有1個聚合根,我創建我的存儲庫,然後我需要添加一些方法,讓我'添加'關聯文件到博客。但我在哪裏把這個?它是一個數據訪問層的東西,所以我真的很想在那裏。但說實話,這也是一個商業邏輯挑戰。部分產品是能夠添加關聯文件。那麼我應該把邏輯添加到DAL或BLL中的Assoc文件?

希望有人能給我一些指導。

+2

這個問題聽起來像流行語賓果:) – ThiefMaster 2012-04-14 09:06:12

回答

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(); 
    } 
} 

更新:讓我們繼續...

思考你域我descovered的5分鐘後,我最初的設計錯過重要的概念(像DDD一樣,你一點一點地颳去知識)。

誰負責上傳文件?用戶可以將他已經上傳到Post的文件關聯,他可以添加新的File(unuploded)文件嗎?他可以混合這些東西嗎?這些都是重要的問題,你需要考慮並設計你的系統。

+0

好吧,我現在看到如何做到這一點。我只是通過Blog repo添加和刪除AssocFiles,因爲這實質上是聚合路線 – Exitos 2012-04-15 14:23:02

1

你在談論倉庫和聚合根,所以我假設你說你想做DDD。 在DDD中,您應該有一個域模型,它應該是您與系統用戶開發的模型。無論如何,它應該包含一個普通用戶應該理解的概念。 因此,如果用戶將Blog看作具有關聯文件的東西,並且這些文件可以添加到Blog中,那麼關聯的文件屬於您的域模型,並且您的Blog對象應該具有添加方法。 我的猜測是你的BLL是你想放置這些相關文件的地方。

1

首先,除非知道有界上下文,否則無法識別聚合根。沒有一個明確的基站沒有AR。根據上下文,ANy對象可以是AR。我不知道你的域名,所以我認爲博客需要添加文件的信息是有效的。所以添加功能在AR中。

存儲庫處理與持久性相關的所有內容,即保存在數據庫中。在這種情況下,它應該包含一個單一的方法,僅此而已,僅此而已。

public interface IBlogFilesRepository 
{ 
    void Save(Blog); 
} 

您總是將域/業務邏輯放入域/ BL層。 DAL只處理保存/加載到數據庫,它在處理域行爲時沒有業務(原文如此)。