Hallo Habr! Unser Kollege Scott Hanselman ist der Ansicht, dass es beim Erlernen einer Programmiersprache wichtig ist, nicht nur zu schreiben und das Schreiben zu üben, sondern auch den Code eines anderen zu lernen. "Lesen Sie den Code eines anderen", sagt Scott und zitiert nützliches Material, das er in der Arbeit seines Kollegen gefunden hat. Weitere Details unter dem Schnitt!
Ich übergebe das Wort an Scott Hanselman . Stimmen Sie ihm zu
Der beste Ansatz zum Erlernen einer Programmiersprache besteht darin, nicht nur mehr Code zu schreiben, sondern auch
deren Beispiele kennenzulernen ! Dies sind nicht immer Beispiele für beispielhaften Code, und vieles, was Sie sehen, wird nicht nützlich sein, aber dies ist eine großartige Möglichkeit, Ihren Horizont zu erweitern.
Ich glaube, dass das Lesen von Code tatsächlich nicht die gebührende Aufmerksamkeit erhält. Möglicherweise gibt es nicht genügend saubere Codebasen.
Ich war also angenehm überrascht, als ich eine Codebasis namens Jimmy Bogard
Contoso University entdeckte .
Dieses Repository hat viel gutes Material, aber ich werde nicht sagen, dass ich alles und so nachdenklich gelesen habe, wie wir möchten. Um alles im Detail zu studieren, müssen Sie den ganzen Tag verbringen. Ich mochte jedoch einige Punkte und nahm sie zur Kenntnis. Einzelne Codeteile sind eindeutig im Stil von Jimmy erstellt, wie er sie für sich selbst geschrieben hat.
Dies ist überhaupt kein Vorwurf. Im Laufe der Zeit sammeln wir alle Vorlagen, erstellen Bibliotheken und entwickeln unsere eigenen Architekturstile. Ich mag die Tatsache, dass Jimmy interessante Entwicklungen gesammelt hat, die er selbst oder mit seiner Teilnahme im Laufe der Jahre gemacht hat, und gutes Lesematerial vorbereitet hat. Jimmy merkt an, dass
ContosoUniversityDotNetCore-Pages viele nützliche Dinge enthält:
Klonen und Assemblieren funktionieren ziemlich gut
Sie werden überrascht sein, wie tief ich manchmal die Messlatte absenke. Sehr oft klone ich das Git-Repository eines anderen, das nirgendwo getestet wurde. Und ich bekomme einen Bonus für das Herunterladen in build.ps1 alles, was benötigt wird.
.NET Core 2.x ist bereits auf meinem
System installiert , build.ps1 empfängt die erforderlichen Pakete und erstellt den Code vollständig.
Es gibt viele Meinungen zu diesem Projekt. Und das ist großartig, denn so lerne ich Methoden und Werkzeuge kennen, die ich vorher noch nicht benutzt habe. Wenn jemand einen nicht standardmäßigen Ansatz verwendet, ist dies unter den Standardwerkzeugen nicht erforderlich!
- Build.ps1 verwendet einen Build- Skriptstil aus PSake , einem PowerShell-Tool zur Build-Automatisierung.
- Die Assembly wird in einem Ordner mit dem Standardnamen ./artifacts abgelegt.
- Build.ps1 verwendet Roundhouse , ein Datenbankmigrationsdienstprogramm für .NET, das SQL-Dateien und -Versionen verwendet, die mit dem Versionskontrolltool projectroundhouse erstellt wurden.
- Es ist für die kontinuierliche Integration in AppVeyor konfiguriert , das hervorragende CI / CD-System, das ich selbst verwende.
- Sie verwendet das Octo.exe- Tool von OctopusDeploy, um Artefakte zu packen.
Ordentlicher und klarer Code
Meiner Meinung nach ist der gesamte Code sehr einfach zu lesen. Ich habe mit Startup.cs begonnen, um zu verstehen, welche Middleware verwendet wird.
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>(); }); }
Hier sehe ich die verwendeten Bibliotheken und Helfer, zum Beispiel AutoMapper, MediatR und HtmlTags. Als nächstes kann ich in separate Abschnitte gehen und jedes Werkzeug studieren.
Miniprofiler
Das
MiniProfiler- Tool hat mir immer gefallen. Dieser geheime .NET-Schatz wurde lange Zeit erstellt und ist bei der Arbeit immer nützlich.
Ich habe ihn 2011 erwähnt! Es ist unsichtbar auf Ihrer Webseite vorhanden und liefert WIRKLICH nützliche Daten über das Verhalten der Site und die wichtigsten Laufzeitwerte.

Es wird empfohlen, es mit EF Core zu verwenden, um auch den generierten SQL-Code anzuzeigen. Und alles ist in die Site eingebettet, während sie erstellt wird.

Einfach toll!
Unit-Tests löschen
Jimmy verwendet XUnit und ich sehe die
IntegrationTestBase- Datei in der Liste
. Ich verstehe einige Punkte nicht, zum Beispiel die Funktionsweise der
SliceFixture- Datei. Brachte ihn zu einer Notiz, um alles gründlich zu verstehen. Es ist unwahrscheinlich, dass hier die Erstellung einer neuen Testhilfsbibliothek gestartet wird: ein zu universeller und seriöser Ansatz, um sie in dieser Vorlage zu verwenden.
Jimmy verwendet das
CQRS- Muster (Command Query Responsibility Segregation). Zu Beginn wird der Befehl Erstellen erstellt und ausgeführt. Anschließend wird eine Abfrage ausgeführt, um die Ergebnisse zu bestätigen. Alles ist sehr klar, wir bekommen einen sehr isolierten Test.
[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); }
Flüssigkeitsvalidierung
Fluentvalidation ist eine nützliche Bibliothek zum Erstellen klarer Validierungsregeln mit starker
Typkontrolle . Jimmy benutzt es überall und bekommt einen extrem klaren Bestätigungscode.
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(); } }
Nützliche Lösungen
Mal sehen, welche Methoden die C # -Projekterweiterung vom Autor verwendet. Dies zeigt, was seiner Meinung nach an der Grundfunktionalität fehlt. Mit dieser Methode können Sie Daten im JSON-Format von Razor Pages zurückgeben.
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" }; } }
Paginierte Liste
Ich habe mich immer gefragt, was ich mit Hilfsklassen wie PaginedList machen soll. Zu klein zum Verpacken, zu spezifisch zum Einbetten. Was denken Sie?
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); } }
Ich erkunde ständig alle Codequellen, die ich finden kann. Ich nehme die Dinge zur Kenntnis, die mir gefallen, notiere, was ich nicht weiß oder nicht verstehe, und erstelle eine Liste mit Themen zum Lesen. Ich würde Ihnen raten, dasselbe zu tun! Vielen Dank,
Jimmy , dass Sie
eine so großartige Codevorlage geschrieben haben, dass wir sie lesen und lernen können!