Intereting Posts
Обходной путь для HttpContext.HideRequestResponse является внутренним? Обнаруживать, действительно ли HttpContext.Request доступен? C # generics – без нижних границ по дизайну? Автоматически десериализовать в class типа string в controllerе Web.API Использование C # для получения списка ACL для серверов и сопоставленных дисков Должен ли IEquatable , IComparable реализоваться на незапечатанных classах? Почему вы не можете объявить статическую структуру в C #, но они могут иметь статические методы? Как установить значения атрибутов с помощью отражения Dapper & MS Access – чтение работает, пишет не Неожиданное поведение в уведомлении тоста из настольного приложения в Windows 10 ValueInjecter и DataTable Как автоматически добавить атрибут placeholder к номеру ввода типа html в mvc 4? Как правильно управлять удалением DataContext? Строка GridView в режиме редактирования Как получить экземпляр базового classа из производного classа Добавление нового controllerа OData не позволяет существующий controller

Шаблон Builder с вложенными объектами

Привет, у меня проблема.

Я хочу реализовать шаблон построения, чтобы упростить создание объектов. Проблема, с которой я сталкиваюсь, связана с вложенным объектом. Объект, который я хотел бы создать, содержит в себе список других объектов, и я действительно не знаю, как его решить.

Я хочу иметь возможность сделать следующее (например, простые объекты):

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

Или что-то вроде:

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

Пример должен быть репрезентативным для моей ситуации, хотя, если вы получили более одного типа вложенного объекта.

    Учитывая такой код

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

    Ваш строитель довольно прост, используя некоторые простые предикаты внутри AddItem Builder AddItem чтобы пользователь мог сконфигурировать каждый элемент в подобном шаблоне «строитель» на верхнем уровне 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 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; } } 

    Рабочий пример: http://rextester.com/IRR50897