public void ScaffoldingDbContextExtensionClass()
        {
            // Arrange
            var definition = new CSharpClassDefinition
            {
                Namespaces =
                {
                    "System",
                    "System.Collections.Generic",
                    "System.Data.SqlClient",
                    "System.Linq",
                    "System.Threading.Tasks",
                    "Microsoft.EntityFrameworkCore"
                },
                Namespace      = "DesignPatterns",
                AccessModifier = AccessModifier.Public,
                IsPartial      = true,
                IsStatic       = true,
                Name           = "NorthwindDbContextExtensions",
                Methods        =
                {
                    new MethodDefinition(AccessModifier.Public,                            "IQueryable<Product>", "GetProducts")
                    {
                        IsStatic    = true,
                        IsExtension = true,
                        Parameters  =
                        {
                            new ParameterDefinition("NorthwindDbContext", "dbContext"),
                            new ParameterDefinition("int?",               "supplierID")
                        },
                        Lines =
                        {
                            new CodeLine("var query = dbContext.Products.AsQueryable();"),
                            new CodeLine(),
                            new CodeLine("if (supplierID.HasValue)"),
                            new CodeLine(1,                                               "query = query.Where(item => item.SupplierID == supplierID);"),
                            new CodeLine(),
                            new ReturnLine("query;")
                        }
                    },
                    new MethodDefinition(AccessModifier.Public,                            "Task<List<CustOrderHist>>", "GetCustOrderHistAsync")
                    {
                        IsStatic    = true,
                        IsAsync     = true,
                        IsExtension = true,
                        Parameters  =
                        {
                            new ParameterDefinition("NorthwindDbContext", "dbContext"),
                            new ParameterDefinition("string",             "customerID")
                        },
                        Lines =
                        {
                            new CodeLine("var query = new"),
                            new CodeLine("{"),
                            new CodeLine(1,                   "Text = \" exec [dbo].[CustOrderHist] @CustomerID \","),
                            new CodeLine(1,                   "Parameters = new[]"),
                            new CodeLine(1,                   "{"),
                            new CodeLine(2,                   "new SqlParameter(\"@CustomerID\", customerID)"),
                            new CodeLine(1,                   "}"),
                            new CodeLine("};"),
                            new CodeLine(),
                            new ReturnLine("await dbContext"),
                            new CodeLine(1,                   ".Query<CustOrderHist>()"),
                            new CodeLine(1,                   ".FromSql(query.Text, query.Parameters)"),
                            new CodeLine(1,                   ".ToListAsync();")
                        }
                    }
                }
            };

            // Act

            var codeBuilder = new CSharpClassBuilder
            {
                OutputDirectory      = @"C:\Temp\CatFactory.NetCore\DesignPatterns",
                ForceOverwrite       = true,
                ObjectDefinition     = definition,
                AddNamespacesAtStart = false
            };

            codeBuilder.CreateFile();
        }
        public void ScaffoldingRepositoryClass()
        {
            // Arrange
            var definition = new CSharpClassDefinition
            {
                Namespaces =
                {
                    "System",
                    "System.Linq",
                    "Microsoft.EntityFrameworkCore"
                },
                Namespace      = "DesignPatterns",
                AccessModifier = AccessModifier.Public,
                Name           = "NorthwindRepository",
                BaseClass      = "Repository",
                Implements     =
                {
                    "INorthwindRepository"
                },
                Constructors =
                {
                    new ClassConstructorDefinition(AccessModifier.Public, new ParameterDefinition("NorthwindDbContext", "dbContext"))
                    {
                        Invocation = "base(dbContext)"
                    }
                }
            };

            definition.Methods.Add(new MethodDefinition(AccessModifier.Public, "IQueryable<Product>", "GetProducts")
            {
                Parameters =
                {
                    new ParameterDefinition("int?", "supplierID")
                },
                Lines =
                {
                    new CodeLine("var query = DbContext.Products.AsQueryable();"),
                    new CodeLine(),
                    new CodeLine("if (supplierID.HasValue)"),
                    new CodeLine(1,                                               "query = query.Where(item => item.SupplierID == supplierID);"),
                    new CodeLine(),
                    new ReturnLine("query;")
                }
            });

            definition.Methods.Add(new MethodDefinition(AccessModifier.Public, "IQueryable<Shipper>", "GetShippers")
            {
                Lines =
                {
                    new ReturnLine("DbContext.Shippers;")
                }
            });

            definition.Methods.Add(new MethodDefinition(AccessModifier.Public, "IQueryable<Order>", "GetOrders")
            {
                Lines =
                {
                    new ReturnLine("DbContext.Orders;")
                }
            });

            // Act

            var codeBuilder = new CSharpClassBuilder
            {
                OutputDirectory      = @"C:\Temp\CatFactory.NetCore\DesignPatterns",
                ForceOverwrite       = true,
                ObjectDefinition     = definition,
                AddNamespacesAtStart = false
            };

            codeBuilder.CreateFile();
        }
        public void TestController()
        {
            // Arrange
            var definition = new CSharpClassDefinition
            {
                Namespace  = "Controllers",
                Name       = "SalesController",
                BaseClass  = "Controller",
                Attributes = new List <MetadataAttribute>
                {
                    new MetadataAttribute("Route", "\"api/[controller]\"")
                }
            };

            definition.Namespaces.Add("System");
            definition.Namespaces.Add("System.Threading.Tasks");
            definition.Namespaces.Add("Microsoft.AspNetCore.Mvc");

            definition.Fields.Add(new FieldDefinition(AccessModifier.Protected, "ISalesRepository", "Repository")
            {
                IsReadOnly = true
            });

            definition.Constructors.Add(new ClassConstructorDefinition(new ParameterDefinition("ISalesRepository", "repository"))
            {
                Lines = new List <ILine>
                {
                    new CodeLine("Repository = repository;")
                }
            });

            definition.Methods.Add(new MethodDefinition(AccessModifier.Protected, "void", "Disposed", new ParameterDefinition("Boolean", "disposing"))
            {
                IsOverride = true,
                Lines      = new List <ILine>
                {
                    new CodeLine("Repository?.Dispose();"),
                    new CodeLine(),
                    new CodeLine("base.Dispose(disposing);")
                }
            });

            definition.Methods.Add(new MethodDefinition("Task<IActionResult>", "GetOrdersAsync", new ParameterDefinition("Int32?", "pageSize", "10"), new ParameterDefinition("Int32?", "pageNumber", "1"))
            {
                Attributes = new List <MetadataAttribute>
                {
                    new MetadataAttribute("HttpGet", "\"Order\"")
                },
                IsAsync = true
            });

            definition.Methods.Add(new MethodDefinition("Task<IActionResult>", "GetOrderAsync", new ParameterDefinition("Int32", "id"))
            {
                Attributes = new List <MetadataAttribute>
                {
                    new MetadataAttribute("HttpGet", "\"Order/{id}\"")
                },
                IsAsync = true
            });

            definition.Methods.Add(new MethodDefinition("Task<IActionResult>", "CreateOrderAsync", new ParameterDefinition("OrderViewModel", "value", new MetadataAttribute("FromBody")))
            {
                Attributes = new List <MetadataAttribute>
                {
                    new MetadataAttribute("HttpPost", "\"Order\"")
                },
                IsAsync = true
            });

            definition.Methods.Add(new MethodDefinition("Task<IActionResult>", "UpdateOrderAsync", new ParameterDefinition("Int32", "id"), new ParameterDefinition("OrderViewModel", "value", new MetadataAttribute("FromBody")))
            {
                Attributes = new List <MetadataAttribute>
                {
                    new MetadataAttribute("HttpPut", "\"Order/{id}\"")
                },
                IsAsync = true
            });

            definition.Methods.Add(new MethodDefinition("Task<IActionResult>", "DeleteOrderAsync", new ParameterDefinition("Int32", "id"))
            {
                Attributes = new List <MetadataAttribute>
                {
                    new MetadataAttribute("HttpDelete", "\"Order/{id}\"")
                },
                IsAsync = true
            });

            // Act
            var builder = new CSharpClassBuilder
            {
                ObjectDefinition = definition,
                OutputDirectory  = "C:\\Temp\\CatFactory.DotNetCore",
                ForceOverwrite   = true
            };

            builder.CreateFile();
        }