рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? .NET рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рд╣рдорд╛рд░реЗ рд╕рд╣рдпреЛрдЧреА, рд╕реНрдХреЙрдЯ рд╣реИрдВрд╕реЗрд▓рдореИрди рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╕реАрдЦрдиреЗ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рди рдХреЗрд╡рд▓ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реИред рд╕реНрдХреЙрдЯ рдиреЗ рдХрд╣рд╛, "рдХрд┐рд╕реА рдФрд░ рдХрд╛ рдХреЛрдб рдкрдврд╝реЗрдВ," рдФрд░ рд╡рд╣ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрд╕рдиреЗ рдЕрдкрдиреЗ рд╕рд╣рдХрд░реНрдореА рдХреЗ рдХрд╛рдо рдореЗрдВ рдкрд╛рдпрд╛ рдерд╛ред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА!



рдореИрдВ рд╕реНрдХреЙрдЯ рд╣реИрдиреНрд╕рдореИрди рдХреЛ рдордВрдЬрд┐рд▓ рджреЗрддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рдЙрд╕рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ?

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рди рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рднреА рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╣реИ ! рдпреЗ рд╣рдореЗрд╢рд╛ рдЕрдиреБрдХрд░рдгреАрдп рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рд╡рд╣ рдмрд╣реБрдд рдХрд╛рдо рдирд╣реАрдВ рдЖрдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЗ рдХреНрд╖рд┐рддрд┐рдЬ рдХреЛ рд╡реНрдпрд╛рдкрдХ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░реАрдбрд┐рдВрдЧ рдХреЛрдб рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб рдЖрдзрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред

рдЬрдм рдореИрдВрдиреЗ рдЬрд┐рдореА рдмреЛрдЧрд░реНрдб рдХреЙрдиреНрдЯреЛрд╕реЛ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдирд╛рдордХ рдПрдХ рдХреЛрдб рдЖрдзрд╛рд░ рдХреА рдЦреЛрдЬ рдХреА рддреЛ рдореБрдЭреЗ рд╕реБрдЦрдж рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖред

рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрдЪреНрдЫреА рд╕рд╛рдордЧреНрд░реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣ рд╕рдм рдкрдврд╝рд╛ рд╣реИ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ, рд╡реИрд╕рд╛ рд╣реА рд╣реИред рд╕рдм рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреВрд░реЗ рджрд┐рди рдмрд┐рддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд╕рдВрдж рдЖрдП, рдФрд░ рдореИрдВрдиреЗ рдЙрди рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ред рдХреЛрдб рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд┐рдореА рдХреА рд╢реИрд▓реА рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЦреБрдж рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛ред

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдлрдЯрдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рд╕рдордп рдХреЗ рд╕рд╛рде, рд╣рдо рд╕рднреА рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдЬрдорд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреА рдЦреБрдж рдХреА рд╕реНрдерд╛рдкрддреНрдп рд╢реИрд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рддрдереНрдп рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдЬрд┐рдореА рдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╛ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЕрдкрдиреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рд╕рд╛рде рджрд┐рд▓рдЪрд╕реНрдк рдШрдЯрдирд╛рдХреНрд░рдо рдПрдХрддреНрд░ рдХрд┐рдП, рдФрд░ рдЕрдЪреНрдЫреА рдкрдарди рд╕рд╛рдордЧреНрд░реА рддреИрдпрд╛рд░ рдХреАред рдЬрд┐рдореА рдиреЛрдЯреЛрдВ рдХрд┐ ContosoUniversityDotNetCore-Pages рдореЗрдВ рдмрд╣реБрдд рд╕реА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ рд╣реИрдВ:


рдХреНрд▓реЛрдирд┐рдВрдЧ рдФрд░ рдЕрд╕реЗрдВрдмрд▓реА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИ


рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛрдВрдЧреЗ рдХрд┐ рдореИрдВ рдХрднреА-рдХрднреА рдХрд┐рддрдирд╛ рдХрдо рдмрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред рдмрд╣реБрдд рдмрд╛рд░ рдореИрдВ рдХрд┐рд╕реА рдФрд░ рдХреА рдЧреИрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдХрд╣реАрдВ рднреА рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдореБрдЭреЗ build.ps1 рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЛрдирд╕ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЬрд░реВрд░рдд рд╣реИред .NET рдХреЛрд░ 2.x рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЗрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ , build.ps1 рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдХреБрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИред

рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рд░рд╛рдп рд╣реИрдВред рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореИрдВ рдЙрди рддрд░реАрдХреЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрддрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдП рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рдЧреИрд░-рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдорд╛рдирдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ!

  • Build.ps1 PSake рд╕реЗ рд▓реА рдЧрдИ рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдПрдХ PowerShell рдмрд┐рд▓реНрдб рдСрдЯреЛрдореЗрд╢рди рдЯреВрд▓ред
  • рдпрд╣ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдорд╛рдирдХ рдирд╛рдо ./artifacts рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред
  • Build.ps1 рд░рд╛рдЙрдВрдбрд╣рд╛рдЙрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред .NET рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдпреВрдЯрд┐рд▓рд┐рдЯреА рдЬреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓рд╣рд╛рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ SQL рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред
  • рдпрд╣ AppVeyor рдореЗрдВ рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг, рдЙрддреНрдХреГрд╖реНрдЯ CI / CD рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЦреБрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
  • рд╡рд╣ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдкреИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП OctopusDeploy рд╕реЗ рдСрдХреНрдЯреЛред Exe рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдХреНрд░рдордмрджреНрдз рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб


рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рднреА рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдореИрдВрдиреЗ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХреАред рдмрд╕ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

public void ConfigureServices(IServiceCollection services) { services.AddMiniProfiler().AddEntityFramework(); services.AddDbContext<SchoolContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddAutoMapper(typeof(Startup)); services.AddMediatR(typeof(Startup)); services.AddHtmlTags(new TagConventions()); services.AddMvc(opt => { opt.Filters.Add(typeof(DbContextTransactionPageFilter)); opt.Filters.Add(typeof(ValidatorPageFilter)); opt.ModelBinderProviders.Insert(0, new EntityModelBinderProvider()); }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_1) .AddFluentValidation(cfg => { cfg.RegisterValidatorsFromAssemblyContaining<Startup>(); }); } 

рдпрд╣рд╛рдБ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдЯреЛрдореИрдкрд░, рдореЗрдбрд┐рдПрдЯрд░ рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓рдЯреИрдЧреНрд╕ред рдЕрдЧрд▓рд╛, рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдХрд░рдг рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

MiniProfiler


рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдорд┐рдиреАрдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдЯреВрд▓ рдкрд╕рдВрдж рдЖрдпрд╛ред рдпрд╣ рдЧреБрдкреНрдд .NET рдЦрдЬрд╛рдирд╛ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИред рдореИрдВрдиреЗ 2011 рдореЗрдВ рдЙрд╕рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд┐рдпрд╛! рдпрд╣ рдЖрдкрдХреЗ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдЕрджреГрд╢реНрдп рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рд╣реИ рдФрд░ рд╕рд╛рдЗрдЯ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдкреНрд░рдореБрдЦ рдХреНрд░рдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред



рдпрд╣ EF рдХреЛрд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рднреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЙрддреНрдкрдиреНрди SQL рдХреЛрдб рдХреЛ рднреА рджреЗрдЦреЗрдВред рдФрд░ рд╕рдм рдХреБрдЫ рд╕рд╛рдЗрдЯ рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдмрд╕ рдорд╣рд╛рди!

рд╕реНрдкрд╖реНрдЯ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг


рдЬрд┐рдореА XUnit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд╕реВрдЪреА рдореЗрдВ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рдирдЯреЗрд╕реНрдЯрдмреЗрд╕ рдлрд╝рд╛рдЗрд▓ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ ред рдореИрдВ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SliceFixture рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕рдВрдЪрд╛рд▓рдиред рдЙрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЛрдЯ рдкрд░ рд▓реЗ рдЧрдпрд╛ред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рдкрд░реАрдХреНрд╖рдг рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдпрд╣рд╛рдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдФрд░ рдЧрдВрднреАрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдгред

рдЬрд┐рдореА CQRS (рдХрдорд╛рдВрдб рдХреНрд╡реЗрд░реА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реЗрдЧреНрд░реАрдЧреЗрд╢рди) рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╢реБрд░реБрдЖрдд рдореЗрдВ, Create рдХрдорд╛рдВрдб рдмрдирд╛рдпрд╛ рдФрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╣рдо рдПрдХ рдмрд╣реБрдд рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

 [Fact] public async Task Should_get_edit_details() { var cmd = new Create.Command { FirstMidName = "Joe", LastName = "Schmoe", EnrollmentDate = DateTime.Today }; var studentId = await SendAsync(cmd); var query = new Edit.Query { Id = studentId }; var result = await SendAsync(query); result.FirstMidName.ShouldBe(cmd.FirstMidName); result.LastName.ShouldBe(cmd.LastName); result.EnrollmentDate.ShouldBe(cmd.EnrollmentDate); } 

Fluentvalidation


рдлреНрд▓реБрдПрдВрд╡рд▓рд┐рдбреЗрд╢рди рдордЬрдмреВрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдЬрд┐рдореА рд╣рд░ рдЬрдЧрд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрддреНрдпрдВрдд рд╕реНрдкрд╖реНрдЯ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

 public class Validator : AbstractValidator<Command> { public Validator() { RuleFor(m => m.Name).NotNull().Length(3, 50); RuleFor(m => m.Budget).NotNull(); RuleFor(m => m.StartDate).NotNull(); RuleFor(m => m.Administrator).NotNull(); } } 

рдЙрдкрдпреЛрдЧреА рдЙрдкрд╛рдп


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ C # рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреА рд░рд╛рдп рдореЗрдВ, рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдХрдореА рд╣реИред рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рд░реЗрдЬрд░ рдкреЗрдЬ рд╕реЗ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

 public static class PageModelExtensions { public static ActionResult RedirectToPageJson<TPage>(this TPage controller, string pageName) where TPage : PageModel { return controller.JsonNet(new { redirect = controller.Url.Page(pageName) } ); } public static ContentResult JsonNet(this PageModel controller, object model) { var serialized = JsonConvert.SerializeObject(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); return new ContentResult { Content = serialized, ContentType = "application/json" }; } } 

PaginatedList


рдореИрдВ рд╣рдореЗрд╢рд╛ рд╕реЛрдЪрддрд╛ рдерд╛ рдХрд┐ рдкрдЧрдореЗрдВрдЯреЗрдбрд┐рд╕реНрдЯ рдЬреИрд╕реЗ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЫреЛрдЯрд╛, рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯред рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ?

 public class PaginatedList<T> : List<T> { public int PageIndex { get; private set; } public int TotalPages { get; private set; } public PaginatedList(List<T> items, int count, int pageIndex, int pageSize) { PageIndex = pageIndex; TotalPages = (int)Math.Ceiling(count / (double)pageSize); this.AddRange(items); } public bool HasPreviousPage { get { return (PageIndex > 1); } } public bool HasNextPage { get { return (PageIndex < TotalPages); } } public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize) { var count = await source.CountAsync(); var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync(); return new PaginatedList<T>(items, count, pageIndex, pageSize); } } 

рдореИрдВ рдХреЛрдб рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрд░реЛрдд рдХреЛ рдЦреЛрдЬрддрд╛ рд░рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЙрди рдЪреАрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИрдВ, рдзреНрдпрд╛рди рджреЗрдВ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдпрд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдПрдВред рдореИрдВ рдЖрдкрдХреЛ рдпрд╣реА рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛! рдзрдиреНрдпрд╡рд╛рдж, рдЬрд┐рдореА , рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд╣рд╛рди рдХреЛрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рд╣рдо рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ!

Source: https://habr.com/ru/post/hi418519/


All Articles