2016-07-20 22 views
6

Xin chào, tôi đang gặp sự cố.Mô hình trình xây dựng với các đối tượng lồng nhau

Tôi muốn triển khai mẫu trình tạo để tạo các đối tượng dễ dàng hơn. Vấn đề tôi phải đối mặt phải làm với đối tượng lồng nhau. Đối tượng tôi muốn tạo có một danh sách các đối tượng khác trong đó và tôi không thực sự có ý tưởng về cách giải quyết nó.

Tôi muốn để có thể làm như sau (đối tượng đơn giản ví dụ):

Receipt RestaurantReceipt = new ReceiptBuilder() 
.withDate("value") 
.withName("value") 
.AddItem("value") 
    .WithIngredients("value") 
    .WithType("value") 
.AddItem("value") 
    .WithIngredients("value") 
    .WithType("value") 
.build(); 

Hoặc một cái gì đó như:

Receipt RestaurantReceipt = new ReceiptBuilder() 
.withDate("value") 
.withName("value") 
.AddItem("value", item => { 
    .WithIngredients("value") 
    .WithType("value") 
}) 
.AddItem("value", item => { 
    .WithIngredients("value") 
    .WithType("value") 
}) 
.build(); 

Ví dụ nên đại diện cho hoàn cảnh của tôi, mặc dù nếu có nhiều hơn một loại đối tượng lồng nhau.

+1

gì mã hiện tại của bạn cho 'ReceiptBuilder' nhìn l ike? Cấu trúc của các mục bạn đang cố gắng thêm vào với 'AddItem' là gì? – Jamiec

+0

Có phải thủ thuật chung không trả lại bản thân thể hiện là giá trị trả về từ các hoạt động đó không? Vậy tại sao không '' ... .AddFoo (new Foo(). WithIngredient ("value"). WithType ("value")). ... ''? Chỉ cần lặp lại mẫu cho các kiểu con đó và sử dụng các hàm/thuộc tính phụ của bộ sưu tập phụ cụ thể. – BitTickler

+0

Sẽ hữu ích khi xem lớp 'Receipt' class – konkked

Trả lời

6

Được mã như thế này

var rb = new ReceiptBuilder(); 
var receipt = rb.WithName("Name") 
      .WithDate(DateTime.Now) 
      .WithItem("Item1", i => i.WithIngredients("Ingredients1")) 
      .WithItem("Item2", i => i.WithIngredients("Ingredients1")) 
      .Build(); 
Console.WriteLine(receipt); 

xây dựng của bạn là khá đơn giản, làm cho sử dụng một số các vị từ đơn giản bên trong phương pháp AddItem xây dựng để cho phép người tiêu dùng để cấu hình mỗi mục trong một "người xây dựng" mô hình tương tự như đầu mức ReceiptBuilder:

public class ReceiptBuilder 
{ 
    private Receipt r; 

    public ReceiptBuilder() 
    { 
     r = new Receipt(); 
    } 

    public ReceiptBuilder WithName(string name) 
    { 
     r.Name = name; 
     return this; 
    } 

    public ReceiptBuilder WithDate(DateTime dt) 
    { 
     r.Date = dt; 
     return this; 
    } 

    public ReceiptBuilder WithItem(string text, Action<ReceiptItemBuilder> itemBuilder) 
    { 
     var rib = new ReceiptItemBuilder(text); 
     itemBuilder(rib); 
     r.AddItem(rib.Build()); 
     return this; 
    } 

    public Receipt Build() 
    { 
     return r; 
    } 
} 

public class ReceiptItemBuilder 
{ 
    private ReceiptItem ri; 

    public ReceiptItemBuilder(string text) 
    { 
     ri = new ReceiptItem(text); 
    } 

    public ReceiptItemBuilder WithIngredients(string ings) 
    { 
     ri.Ingredients = ings; 
     return this; 
    } 

    // WithType omitted for brevity. 

    internal ReceiptItem Build() 
    { 
     return ri; 
    } 
} 

dụ làm việc: http://rextester.com/IRR50897

Các vấn đề liên quan