2

我在開發的軟件,在這裏我有幾個實體,如:分層架構問題

public class Workspace 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 

     public virtual List<Playground> Playground { get; set; } 
     public virtual List<Workspace> Children { get; set; } 
     public virtual List<Member> Members { get; set; } 

     public virtual Workspace Parent { get; set; } 
    } 

public class Playground 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 

     public virtual List<Service> Services { get; set; } 

     public virtual Workspace Workspace { get; set; } 
    } 

public class Service 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 

     public virtual Playground Playground { get; set; } 
    } 

這些都是我EF4 POCO對象。我正在使用存儲庫模式和以下接口:

public interface IRepository<T> 
{ 
    void Add(T entity); 
    void Delete(T entity); 
    IEnumerable<T> Get(Expression<Func<T, bool>> expression); 
    IEnumerable<T> Get(); 
    void Attach(T entity); 

    int Save(); 
} 

存儲庫具有內部ObjectContext。我有一個UnitOfWork,它包含我的存儲庫的實例,並負責保存對它們所做的更改。

我到底做得對嗎?

我實現業務邏輯層是這樣的:

public class DomainWorkspaceService : DomainServiceBase 
    { 

     public DomainWorkspaceService(Workspace workspace) 
      : base(UnitOfWorkFactory.GetInstance()) 
     { 
     } 

     public void Create(Workspace workspace) 
     { 
      UoW.GetRepository<Workspace>().Add(workspace); 
     } 

     public void Delete(Workspace workspace) 
     { 
      var pservice = new DomainPlaygroundService(); 
      foreach (var playground in workspace.Playground) 
       pservice.Delete(playground); 

      foreach (var child in workspace.Children) 
       Delete(child); 
     } 

    } 

現在,我不知道我在正確的方向我要去。我的波蘇斯是(會)負責審定,將使我做這樣的事情

SomeWorkspace.Children.Add(new Workspace {...}); 

由於這些對象與上下文相關的,當我救他們將更改到收藏也被保存在數據庫中?

此外,我希望我的遊樂場不能在沒有遊樂場的情況下沒有工作區和服務的情況下創建。我應該在哪裏創建和刪除它們?

謝謝。

+1

如果你不想強迫操場用工作區構建 - 添加需要它們的構造函數。服務也是一樣。 – 2010-08-24 18:57:04

+0

是的。謝謝。 – codegarten 2010-08-24 19:08:14

回答

1

到目前爲止,這麼好。

您可能想將Save方法從存儲庫移到工作單元上。在實體框架中,您必須立即保存上下文中的所有更改;你不能每個類型都做。將它放在存儲庫上意味着只保存對存儲庫的更改,這可能不正確。

您可能想要實現從工作區到操場的級聯,作爲數據庫級聯(實體框架將識別和支持),而不是手動編碼它們。

是的,保存對上下文的更改將保存所有跟蹤的更改,包括相關對象。

關於添加,如果您不公開ObjectContext,那麼任何人都可以添加Playground的唯一方法是通過與您公開的對象的關係。

+0

是的,保存不應該在存儲庫上,我會將刪除更改爲級聯。現在我在創建方法時遇到問題(創建(即)服務時需要一些額外的處理)。它們是否應該放置在特定的對象中,例如上面添加的DomainWorkspaceService?謝謝 – codegarten 2010-08-24 19:06:33

+0

我的經驗法則是,存儲庫嚴格封裝持久性。如果它是業務邏輯,它就在服務中。如果它是與持久性相關的(例如,ID生成或類似的東西)它會進入存儲庫。存儲庫應該相當簡單。 – 2010-08-24 19:15:26