2016-07-20 49 views
6

Merhaba Bir sorunla karşılaştım.Yuvalanmış nesnelerle oluşturucu desen

Nesnelerimi daha kolay oluşturmak için oluşturucu modelini uygulamak istiyorum. Karşılaştığım problem, iç içe geçmiş nesnelerle ilgili. Oluşturmak istediğim nesne içinde başka nesnelerin bir listesi var ve bununla nasıl başa çıkacağına dair bir fikrim yok. fazlası var ise de,

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

Örnek benim durum için temsil etmelidir: gibi

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

Ya bir şey:

aşağıdaki (örneğin basit nesneler) yapmak isterler iç içe geçmiş nesnenin bir türü.

+1

ike? 'AddItem' ile eklemeye çalıştığınız öğelerin yapısı nedir? – Jamiec

+0

Genel hile, bu işlemin geri dönüş değeri olarak kendini geri döndürmüyor mu? Öyleyse neden ''. .AddFoo (yeni Foo(). WithIngredient ("value"). WithType ("value")). ... ''? Sadece bu alt türler için kalıbı tekrarlayın ve alt toplama özel Ekleme İşlevlerini/özelliklerini kullanın. – BitTickler

+0

"Makbuz" sınıfını görmeye yardımcı olabilir – konkked

cevap

6
bu

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); 

gibi

Verilen kod Kişisel kurucusudur oldukça basit, tüketici üstüne benzer "oluşturucu" desen her bir öğeyi yapılandırmak için izin AddItem oluşturucu yöntemin içinde bazı basit yüklemler yararlanarak seviye 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; 
    } 
} 

Çalışma örneği: http://rextester.com/IRR50897 `ReceiptBuilder` görünüm l için geçerli kod ne yapar