Advertisement
Guest User

Fluent Builder Pattern with Multiple Inheritance C#

a guest
Dec 9th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.43 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.CompilerServices;
  4.  
  5. namespace ConsoleApp5
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             Console.WriteLine("Hello World!");
  12.  
  13.             new IncidentModifier(ticketNumber: "INC0000001")
  14.                 .SetShortDescription()
  15.                 .SetCaller()
  16.                 .ChangeAssignedAgent()
  17.                 .ChangeAssignmentGroup()
  18.                 .ModifyTicket();
  19.  
  20.             new IncidentCreator(caller: "Some User"
  21.                 , description: "Example description", shortDescription: "simple description")
  22.                 .ChangeAssignmentGroup()
  23.                 .ChangeAssignedAgent()
  24.                 .CreateTicket();
  25.         }
  26.     }
  27.  
  28.  
  29.  
  30.     public  class BuilderBase<T>  : IBuilder<T> where T : class,IBuilder<T>
  31.     {
  32.  
  33.  
  34.         public T SetDescription()
  35.         {
  36.             Console.WriteLine("Setting Description");
  37.             return this as T;
  38.         }
  39.  
  40.         public T SetShortDescription()
  41.         {
  42.             Console.WriteLine("Setting short description");
  43.             return this as T;
  44.         }
  45.  
  46.         public void FinalizeProperties()
  47.         {
  48.            
  49.         }
  50.  
  51.         public T ChangeAssignedAgent()
  52.         {
  53.             Console.WriteLine("Changing Assigned Agent");
  54.             return this as T;
  55.         }
  56.  
  57.         public T ChangeAssignmentGroup()
  58.         {
  59.             Console.WriteLine("Changing Assignment Group");
  60.             return this as T;
  61.         }
  62.  
  63.         public T ChangeSomethingElse()
  64.         {
  65.             Console.WriteLine("Changing something else");
  66.             return this as T;
  67.         }
  68.     }
  69.  
  70.  
  71.  
  72.  
  73.     public interface IBuilder<T> where T : class, IBuilder<T>
  74.     {
  75.         T ChangeAssignedAgent();
  76.         T ChangeAssignmentGroup();
  77.         T ChangeSomethingElse();
  78.     }
  79.  
  80.  
  81.     internal interface IIncidentBuilder<T> where T : class, IBuilder<T>
  82.     {
  83.         T SetCategory();
  84.         T SetSubcategory();
  85.         T SetRelatedChange();
  86.     }
  87.  
  88.     public class IncidentBuilder<T> : BuilderBase<T>, IIncidentBuilder<T> where T : class, IBuilder<T>
  89.     {
  90.         public IncidentBuilder()
  91.         {
  92.         }
  93.  
  94.         public T SetCaller()
  95.         {
  96.             Console.WriteLine("Setting Caller");
  97.             return this as T;
  98.         }
  99.  
  100.  
  101.         public T SetCategory()
  102.         {
  103.             Console.WriteLine("Setting Category");
  104.             return this as T;
  105.         }
  106.  
  107.         public T SetSubcategory()
  108.         {
  109.             Console.WriteLine("Setting subcategory");
  110.             return this as T;
  111.         }
  112.  
  113.         public T SetRelatedChange()
  114.         {
  115.             Console.WriteLine("Setting related change");
  116.             return this as T;
  117.         }
  118.     }
  119.  
  120.     public class IncidentModifier : IncidentBuilder<IncidentModifier>
  121.     {
  122.         private ITicketGetter getter;
  123.         private string ticketNumber;
  124.  
  125.         public IncidentModifier(string ticketNumber)
  126.         {
  127.             this.ticketNumber = ticketNumber;
  128.             getter.GetTicket(ticketNumber);
  129.         }
  130.  
  131.         public void ModifyTicket()
  132.         {
  133.            getter.ModifyTicket(this);
  134.         }
  135.     }
  136.  
  137.     public class TickerService : ITicketGetter, ITicketCreator
  138.     {
  139.         public void ModifyTicket<T>(IBuilder<T> builder) where T : class, IBuilder<T>
  140.         {
  141.             Console.WriteLine("Modifying ticket");
  142.         }
  143.  
  144.         public string GetTicket(string ticketNumber)
  145.         {
  146.             return $"Obtained ticket {ticketNumber}";
  147.         }
  148.  
  149.         public string CreateNewTicket<T>(IBuilder<T> builder) where T : class, IBuilder<T>
  150.         {
  151.             return "Successfully created your ticket!";
  152.         }
  153.     }
  154.  
  155.     public interface ITicketCreator
  156.     {
  157.         string CreateNewTicket<T>(IBuilder<T> builder) where T : class, IBuilder<T>;
  158.     }
  159.  
  160.     public interface ITicketGetter
  161.     {
  162.         void ModifyTicket<T>(IBuilder<T> builder) where T : class, IBuilder<T>;
  163.         string GetTicket(string ticketNumber);
  164.     }
  165.  
  166.     public class IncidentCreator : IIncidentBuilder<IncidentCreator>, IBuilder<IncidentCreator>
  167.     {
  168.         private ITicketCreator creator;
  169.         private IncidentBuilder<IncidentCreator> builder;
  170.         public IncidentCreator(string caller, string description, string shortDescription)
  171.         {
  172.             creator = new TickerService();
  173.             builder = new IncidentBuilder<IncidentCreator>();
  174.             builder.SetCaller();
  175.             builder.SetDescription();
  176.             builder.SetShortDescription();
  177.         }
  178.  
  179.      
  180.  
  181.  
  182.         public IncidentCreator SetCategory()
  183.         {
  184.             return builder.SetCategory();
  185.         }
  186.  
  187.         public IncidentCreator SetSubcategory()
  188.         {
  189.             return builder.SetSubcategory();
  190.         }
  191.  
  192.         public IncidentCreator SetRelatedChange()
  193.         {
  194.             return builder.SetRelatedChange();
  195.         }
  196.  
  197.         public IncidentCreator ChangeAssignedAgent()
  198.         {
  199.             return builder.ChangeAssignedAgent();
  200.         }
  201.  
  202.         public IncidentCreator ChangeAssignmentGroup()
  203.         {
  204.             return builder.ChangeAssignmentGroup();
  205.         }
  206.  
  207.         public IncidentCreator ChangeSomethingElse()
  208.         {
  209.             return builder.ChangeSomethingElse();
  210.         }
  211.  
  212.         public void CreateTicket()
  213.         {
  214.             creator.CreateNewTicket(this);
  215.         }
  216.      
  217.     }
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement