2012-11-07 51 views
0

我正在嘗試學習DDD,並且正在製作一個簡單的演示項目。DDD:在將數據插入數據庫之前,對象ID必須爲0

現在,我有一個通用的存儲庫

public class Repository<T> where T : class, IAggregateRoot 
{ 
    public void Add(T entity) 
    { 
     ObjectSet.AddObject(entity); 
    } 
} 

Product

public class Product : IAggregateRoot 
{ 
    private Guid _id = Guid.Empty; 
    public Guid Id 
    { 
     get { return _id; } 
     private set { _id = value; } 
    } 
    public string Name { get; private set; } 

    protected Product() { } 
    public Product(string name) 
    { 
     Name = name; 
    } 
} 

的想法是,我想,這已經創造了一個產品有一個空的GUID。只有在插入數據庫時​​才應該得到一個新的Guid。

Product product = new Product("Hello World"); 
product.Id == Guid.Empty; // True 

現在怎麼樣,當我調用存儲庫插入產品時,它將它插入數據庫並使用空的Guid。

var repository = new Repository<Product>(); 
repository.Add(product); 

我應該把Guid代產品放在哪裏?在存儲庫中?如果是的話,我應該怎麼做,因爲我有一個通用的存儲庫。

謝謝

回答

3

你可以改變IAggregateRoot定義添加一個ID屬性,這樣

interface IAggregateRoot 
{ 
    Guid Id { get; set;} 
} 

爲每類項目將有一個id,將實現IAggregateRoot接口,可以初始化類裏面的ID構造函數,像這樣:

public class Product : IAggregateRoot 
{ 
    public Guid Id { get; set; } 
    public string Name { get; private set; } 


    protected Product() { } 
    public Product(string name) 
    { 
     Id = Guid.Empty; 
     Name = name; 
    } 
} 

,並在倉庫裏的添加方法,你可以把Guid.NewGuid(),然後將它傳遞着

public class Repository<T> where T : class, IAggregateRoot 
{ 
    public void Add(T entity) 
    { 
     entity.Id = Guid.NewGuid(); 
     ObjectSet.AddObject(entity); 
    } 
} 
+1

+1,但Id應該有一個非公開的setter。 – jgauffin

1

有沒有你想的原因在數據庫中創建的GUID,而不是創造的對象呢?我認爲最簡單的解決方案是將屬性設置爲Guid.NewGuid()。如果你真的想讓表執行這個工作,儘管你可以在你的對象中使它可以爲空,並將表中列的默認值設置爲newid()。

+0

我已經看過一個示例(需求)的教程,產品應該有id = 0之前持續,只是爲了更清楚地 – Catalin

相關問題