void Main() { Console.WriteLine(ClassicReportGenerator .BuildReport( DateTime.Now, DateTime.Now.AddDays(5), true )); //Fluid interface //http://scottlilly.com/FIWebinar //we want a method that we can call like this //create.from(date).to(date).Build() //Instantiate, Chain, Execute (ICE) Console.WriteLine( FluentReportGenerator.CreateReport() .From(DateTime.Now) .To(DateTime.Now.AddDays(5)) .SortDescending() .Build() ); } class ClassicReportGenerator { public static string BuildReport(DateTime from, DateTime to, bool sortAscending) { return string.Format("ClassicReportGenerator build report succeeded {0} - {1}. Sort {2}", from, to, sortAscending? " ascending" : "descending"); } } class FluentReportGenerator:ICanSetFromDate, ICanSetToDate, ICanBuildReport, ICanSortOrBuildReport { DateTime _from { get; set; } DateTime _to { get; set; } bool _sortAscending { get; set;} private FluentReportGenerator() {} public static ICanSetFromDate CreateReport() { return new FluentReportGenerator(); } public ICanSetToDate From(DateTime date) { _from = date; return this; } public ICanSortOrBuildReport To (DateTime date) { _to = date; return this; } public ICanBuildReport SortAscending() { _sortAscending = true; return this; } public ICanBuildReport SortDescending() { _sortAscending = false; return this; } public string Build() { return string.Format("FluentReportGenerator build report succeeded {0} - {1}. Sort {2}", _from, _to, _sortAscending?" ascending":"descending"); } } #region Intefaces interface ICanSetFromDate { ICanSetToDate From(DateTime date); } interface ICanSetToDate { ICanSortOrBuildReport To(DateTime date); } interface ICanSortOrBuildReport { ICanBuildReport SortAscending(); ICanBuildReport SortDescending(); string Build(); } interface ICanBuildReport { string Build(); } #endregion