2016-05-15 41 views
0

我正在嘗試將我的對象更改爲富域模型。我原來的班,試圖用豐富的域模型來取代它之前,是這樣的:如何正確實現依賴注入的豐富域模型

public class StudentLogic : IStudentLogic 
{ 
    private IUnitOfWork _uow; 
    private IStudentRepository _studentRepository; 

    public StudentLogic(IUnitOfWork uow, 
     IStudentRepository studentRepository) 
    { 
     _uow = uow; 
     _studentRepository = studentRepository; 
    } 

    public int CreateStudent(IStudent newStudent) 
    { 
     return _studentRepository.Create(newStudent); 
    } 
} 

隨着IStudent聲明:

public interface IStudent 
{ 
    string FirstName { get; set; } 
    string LastName { get; set; } 
} 

所以現在我嘗試轉換爲富域模型。

學生不能存在沒有名字和姓氏,所以根據我讀到的有關豐富域模型的內容,這應該包含在構造函數中。我爲學生提供的豐富域名模型如下所示:

public class Student : IStudent 
{ 
    public Student(string firstName, string lastName) 
    { 
     this.FirstName = firstName; 
     this.LastName = lastName; 
    } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public int Create() 
    { 
     return _studentRepository.Create(this); 
    } 
} 

如何注入UoW和Repository?將它與firstName和lastName一起放入構造函數似乎很尷尬。我所遵循的模式通常是正確的嗎?

+0

在我看來,'Create'方法真的屬於'Student'類。你不應該強迫自己創建一個豐富的域模型。如果某些行爲屬於實體本身,那麼它應該在那裏。如果它不屬於那裏,那麼你不應該強迫它在那裏,即使這意味着有時你最終會形成一個「貧血」模型。 –

回答

1

檢查接口不能聲明與訪問修飾符成員一樣 public,他們不能定義 領域但屬性,事件,方法... 我在你的問題解決了這個問題,編輯。 ..

在另一方面,豐富的域模型 woudn't創建一個持久域對象和代表整個創作方法不會返回一個整數創建的域對象。

關於依賴注入,在C#中,並根據控制容器的倒置,您可以使用注射構造依賴財產依賴依賴。

使用構造時依賴關係的重點在於它們是強制性的。如果您的域對象在沒有存儲庫和工作單元實現的情況下無法工作,那麼您需要在域對象的構造函數中要求它們。否則,如果一些依賴的是可選,您可以使用財產注入注入它:

public class Some 
{ 
    // Mandatory, because a non-optional constructor parameter 
    // must be provided or C# compiler will cry 
    public Some(IUnitOfWork uow) { ... } 

    // Optional, because you may or may not set a property 
    public IRepository<...> Repo { get; set; } 
} 

最後,在施工期間設置屬性是不是一個域的要求豐富 。什麼使領域模型非貧血是域對象不只是數據存儲但它們提供行爲

+0

「建設期間的設置屬性不是一個域的豐富性的要求」 - 我意識到這一點,但我讀到,我應該把需要的構造函數屬性(對象應該不存在瓦特/ o這些屬性)。如果這是正確的,我的構造函數將包括:firstName,LastName,存儲庫和UoW(假定需要存儲庫和UoW)。這可以嗎? –

+0

@g_b你不應該把模式當作教條。將它們適應於您的具體領域,甚至可以採取自己的架構決策。通常,如果您需要將它們映射到基礎數據庫(如使用OR/M)時,沒有無參數構造函數的域對象是一個壞主意。 –

+0

@g_b另外,關於完整的豐富域模型的便利性,甚至*貧血域模型*都是反模式都有很多討論。我相信你應該在兩個概念之間找到平衡點。現在不要將任何行爲從服務層移到域模型。這將實現*活動記錄*設計模式,而不是*豐富的域模型*。 –