2011-05-20 72 views
2

對於Microsoft MVC,我有以下問題 - 或者更確切地說,迫切需要有價值的建議。來自客戶端的某個動作導致創建的:Microsoft MVC中服務層和存儲庫的設計

  • 在表中的一句話備註
  • 在表中HourRegistrations
  • 門票

在更改日誌中的條目的條目我使用業務操作的服務層和CRUD操作的存儲庫。問題是我有時需要連接來自不同DataContext的對象,所以我想我使用了一個有缺陷的設計。最近我們已經開始從控制器和存儲庫中刪除所有業務邏輯,這是我遇到的第一件事情之一。

實施例:

BLogic.AddRemarks(Ticket t, ...) 
{ 
    Remark r = _remarksRepository.Create(); 
    r.Ticket = t; 
    _remarksRepository.Add(r); 
    _remarksRepository.Save(); 
} 

這觸發kBOOM因爲票證是在使用所述存儲庫中的控制器獲取。所以備註r和票據t不共享相同的數據上下文。

我可以改變方法的簽名,並提供一個int TicketId,但這並不正確。此外,我接下來會遇到類似的問題。

我的存儲庫是在服務類的構造函數中創建的。也許我必須在方法開始時創建它們?即使那樣,我也必須經常調用Ids而不是真正的對象。

回答

3

我的建議是使用依賴注入(或控制反轉 - 取決於你想如何調用它)。我用我自己的城堡windor。真的很容易與mvc.net集成。 read more

當IoC啓動並運行時創建ContextManager。 Somethig這樣的:

public class ContextManager : IContextManager 
{ 
    private XContext context; 

    public XContext GetContext() 
    { 
     return context ?? (context = XContext.Create()); 
    } 
} 

設置IContextManager生活方式perwebrequest和你有你自己,你可以從信息庫和服務訪問上下文。每個請求都是一樣的。

編輯

你也可以創建自己的ControllerFactory

那麼你可以使用你的服務和存儲庫這樣的:

public class MyController : Controller 
{ 
    public ISomeService SomeService { get; set; } 
    public IContextManager ContextManager { get; set; } 

... 

} 

你不必創建一個服務和存儲庫的新實例你可以通過配置管理這些對象的生活方式。最合理的是單身人士

+0

術語DI和IoC不可互換,意味着兩件事情不同。通過使用DI來實現IoC。 Windsor,Unity,Ninject是您用來反轉控制的DI框架。 ;) – jfar 2011-05-20 14:23:43

+0

因此,在控制器動作開始時,我應該初始化一個上下文管理器並從中取出必要的對象?我可以從服務層訪問上下文管理器,而不必在那裏明確提供它嗎?或者這是一個服務層的解決方案,因爲我可以使用所需的數據上下文創建存儲庫。 – Paul77 2011-05-20 14:30:45

+0

@Paul使用控制器的構造函數來包含ContextManager依賴項。對服務層類也一樣。不要在你的方法中實例化ContextManager。 – mxmissile 2011-05-20 14:41:25