62
Senior Software Architect und Technology Advisor Syrian Hadad Wenn neue Technologie auf reale Anforderungen trifft 27. Juni 2017 .NET Core im Praxistest

NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

  • Upload
    others

  • View
    21

  • Download
    0

Embed Size (px)

Citation preview

Page 1: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Senior Software Architect und Technology Advisor

Syrian Hadad

Wenn neue Technologie auf reale Anforderungen trifft

27. Juni 2017

.NET Core im Praxistest

Page 2: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

400

Rechenzentrum Softwareentwicklung

Softwarelösungen im kantonalen Umfeld und für den Bund

Page 3: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

1Lessons learned20’

Warum .NET Core?15’ 2 Die ersten Projekte

45’

3

Fragen und Antworten5Tipps & Tricks20’4

Page 4: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

WARUM .NET CORE?

Page 5: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

.NET Fairytale

Page 6: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

.NET Fairytale

Es war einmal eine einfache, Windows-basierte Welt mit .NET

Linux-Freunde haben im 2004 veröffentlicht, es fristete jedoch lange nur ein Schattendasein

.NET für Windows aber entwickeltesich Jahr für Jahr munter weiter

Und wenn .NET nicht gestorben ist, dann lebt es noch heute…

Page 7: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Oder doch nicht?

• Halt, die Geschichte verlief irgendwie anders…

Page 8: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Es gab zwei Pfade…

j-photo-u1

Windows-onlyCross-plattform

Page 9: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Da gab es doch noch eine Liebeserklärung…

Page 10: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Es musste sich weiterentwickeln, aber wie?

Die ersten Strategien…

Page 11: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Was ist genau passiert?

2015 2016 2017

ASP.NET vNext ASP.NET 5

ASP.NET Core.NET Core

.NET Core 2.0.NET

Standard?

Page 12: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

.NET Standard?

Page 13: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

.NET Standard…

Page 14: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Sie mussten aber (technische) Schulden begleichen...

.NET CoreAPIs

.NET Framework APIs

SharedAPIs

Schuldenfrei

Page 15: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Wie wurden die Schulden beglichen?

Keine nativen GUIs wieWinForms oder WPF

ReflectionAPI umgebaut

Object.GetType() repräsentiertnicht mehr den vollen Reflection-Type

(«pay-for-play friendly»)

KeineApp Domains

«For code isolation we recommendprocesses and/or container»

Kein.NET RemotingMicrosoft emfpiehlt:

«a low-overhead plain textprotocol such as HTTP»

Keine Binary Serialisierung«[..] serialization should be a protocol

implemented on top of the available publicAPIs […] binary serialization requires intimate Knowledge […] which includes private state»

Kein SandboxingMicrosoft emfpiehlt:

«run under a user accountwith restricted permissions»

KeinSystem.Drawing

Kein:System.DataSystem.DirectoryServicesSystem.TransactionsSystem.Xml.XslSystem.Xml.SchemaSystem.Net.MailSystem.IO.PortsSystem.Workflow… Erscheinen teilweise in .NET Core 2.0

Page 16: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Wieso verzichtet man auf all das?

Page 17: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

High-Performance und skalierbare Systeme

Docker Support

CLI Support (z.B. CI mit Bamboo, andere Entwicklungsumgebung)

Weil…

Page 18: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Und…

Cross-plattform (Tiefe Kosten im Betrieb)

Microservices Architektur

Open-Source (Tiefe Kosten in der Entwicklung)

Page 19: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Beweggründe der Bedag Informatik AG

Single-Page-ApplicationStrategie

Containerisierung Open-Source Strategie Betriebskosten senken

Page 20: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

.NET Core recapC#Es kann wie gewohnt in C#, VB oder F# geschrieben werden

1

ModularLeichtgewichtig, da nur die nötigen Packages genutzt werden

2

Open-SourceDie Runtime, Libraries, Compiler, Sprachen und Tools sind alle unter GitHub publiziert

3

Cross-PlattformEinmal schreiben, überall nutzen4

Häufigere Deployments Den Puls der Weiterentwicklung

spüren, kurze Update-Zyklen8

CLIUnabhängigkeit vom Visual

Studio mit dem Command Line Interface

7

SchnellBenchmarkresultat: 8x schneller

als Node.js6

NuGetUpdates nur noch über NuGet, keine Windows Updates mehr,

dadurch entfallen die Major .NET Releases

5

.NETCore 7

6

5

4

82

3

1

C#8

Page 21: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

DIE ERSTEN PROJEKTE

Page 22: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Projekte

PsyReg Online-Anmeldung

Anmeldung zur eidgenössischen

Prüfung für Gesundheitsberufe

Psychologieberuferegister

Page 23: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Kontext

Page 24: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Schichtenmodell

Page 25: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Screenshots

Page 26: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Security-Architekturcmp Security-Architektur

MedReg/Meduse Datenbank

Identity Store

MedReg Personenmodul / Meduse Web App

MedReg Web Services

Web Service Clients (MedReg)

Clients mit Webbrowser

Bedag IAM Bridge

PsyReg Web Frontend (AngularJS)

PsyReg REST Backend (.NET)

User Federation Provider

HTTPS (REST)

HTTPS (Bezug Ressourcen;Anwendung wird im Browserausgeführt)

HTTPS (Login Page)

OpenID Connect

OpenID Connect

HTTPS HTTPS

• OAuth2 und OpenID Connect• KeyCloak fungiert als Bridge• User werden in einem fremden

Identity Store gehalten• Authentifizierung Sache von

KeyCloak (Bedag IAM Bridge)• Autorisierung Sache der

Anwendung (PsyReg)

Page 27: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Security in .NET Core

Umgesetzt mit Middleware

Page 28: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Am Anfang…

• Keine Möglichkeit, OIDC out-of-the-box zu nutzen• Middleware geschrieben:

• OpenIdConnectAuthenticator• IUserInfoReader, OpenIdConnectUserInfoReaderKeycloakOpenIdConnectUserInfoReader

• Autorisierung über Attribut im Controller:

Page 29: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Heute möglich…

Page 30: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Dependency Injection

Aber: Sehr «Basic», keine attraktiven Registrierungsmöglichkeiten:

• Built-In in ASP.NET Core

Page 31: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Transient„[…] Created each time they are requested. [...]“

Scoped„[…] Created once per request. [...]“

Singleton„[…] Singleton lifetime services are created thefirst time they are requested [...]“

Page 32: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Unsere Anforderungen…

• CQRS Pattern mit ICommandHandler und IQueryHandler• Generische Registrierung aller davon implementierenden

Klassen• Eine gute Lösung musste her

Page 33: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Unsere Lösung:

GenericsContainer.Register(typeof(ICommandHandler<>), Assembly.Load(someAssembly));

Container.RegisterConditional(typeof(IValidator<>), typeof(LeftValidator<>), c => c.ServiceType.GetGenericArguments().Single().Namespace.Contains("Left"));Container.RegisterConditional(typeof(IValidator<>), typeof(RightValidator<>), c => c.ServiceType.GetGenericArguments().Single().Namespace.Contains("Right"));

services.AddSingleton<IControllerActivator>(new SimpleInjectorControllerActivator(Container));services.UseSimpleInjectorAspNetRequestScoping(Container);

Aktivierung sehr simpel:

Open-Source

Schnell

Page 34: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Testing

• NUnit wurde durch xUnit als neuer Standard in der Bedag abgelöst

• xUnit gehört zur• Wird von Microsoft eingesetzt• «Echtes» Mocking erst seit kurzem möglich

• Wegen Reflection Umbau• Zuerst mehrheitlich Integrationstests

• Nun auch Unittests mit «Moq»mailClientMock.Verify(m => m.SendMail(It.IsAny<MailContentDto>()), Times.Exactly(2));

Page 35: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Probleme bei den Tests

• Integrationstests aufgebaut • Kestrel In-Memory Webserver • Entity Framework Core In-Memory DB

• Aber: DB prüfte die referentielle Integrität nicht

Page 36: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Unsere Lösung:

• Alternative SQLite In-Memory

• Entity Framework Core hat einen SQLite Provider• Referentielle Integrität?

• Wird überprüft

var connection = new SqliteConnection("DataSource=:memory:");

Page 37: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Entity Framework Core

DB-First ReloadEntity

Local(Cache)

LazyLoading

DataAnnotationsValidierungen

Direkte Many-to-Many

Verbindung

Was fehlt?

Sehr schnell

Sehr (zu) schlank

Page 38: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Entity Framework Core kann aber…

… problemlos produktiv eingesetzt werden:• Keine Killerfeatures die fehlen• DB-First funktioniert auch mit bestehenden Tabellen

• Teilweise umständlich:

• Attribute vs. «ModelBuilder» teilweise doppelspurig und verwirrend

Page 39: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

ASP.NET Core mit Kestrel hervorragend

Services

• Bereitstellung von SOAP out-of-the-box nicht mehr möglich

• WCF nur als Client• Verwendet für die Anbindung von

MS SQL Server Reporting Services

Page 40: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Mailversand

• Open-Source..• https://github.com/jstedfast/MailKit

• Sehr einfache Verwendung

System.Net.Mail fehlt, was tun?

Page 41: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Continuous Integration

Auftrag: CI mit und

• Bitbucket basiert auf GIT• Integration nahtlos im Visual Studio

• Ausser «Pull Requests», die funktionieren nur mit GitHub

auf deployen

Page 42: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Bamboo

• Agent für den Buildprozess• .NET Core SDK (für die CLI) muss auf dem Agent installiert

werden

• Danach folgt Script um Script um Script…1. «dotnet restore» (jedes einzelne Projekt…)2. «dotnet build */**/project.json» (Alle Projekte auf einmal)3. «dotnet test» (jedes Testprojekt einzeln…)4. «dotnet publish»5. «msdeploy.exe …..»

Page 43: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

msdeploy.exe• Muss auf dem Agent installiert werden (benötigt Windows)

• Verträgt sich mit ASP.NET Core nicht so richtig• -enableRule:AppOffline funktioniert nicht (Case sensitivity Problem wegen

app_offline.htm)• https://github.com/aspnet/AspNetCoreModule/issues/50

• Unsere Lösung:

• StopAppPool

• Deploy

• StartAppPool

msdeploy -verb:sync -source:recycleApp -dest:recycleApp="abc",computerName="https://abc/msdeploy.axd?site=abc",recycleMode="StopAppPool",authType="basic",userName="*",password="*" -allowUntrusted=true

msdeploy -verb:sync -source:contentpath="C:\temp\abc" -dest:contentPath="abc",computerName=https://abc/msdeploy.axd?site=abc,username="*",password="*",authType=basic -allowUntrusted=true

msdeploy -verb:sync -source:recycleApp -dest:recycleApp="abc",computerName="https://abc/msdeploy.axd?site=abc",recycleMode="StartAppPool",authType="basic",userName="*",password="*" -allowUntrusted=true

Page 44: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

LESSONS LEARNED

Page 45: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

IIS und ASP.NET Core sind nicht die besten Freunde

• «Kestrel» ist eigener Webserver, IIS nur «Durchlauferhitzer» (Reverse Proxy)

Page 46: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Falls etwas nicht funktioniert, aktualisiere alles…

• Wenn du komische Fehler erhältst, aktualisiere alle deine NuGet-Packages…

Page 47: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Stell dich auf wöchentliche Updates ein…

• Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1)

• Und es werden wirklich Fehler korrigiert…“The column prefix 't0' does not match with a table name or alias name used in the query. No column name was specified for column 1 of 't1’” mit Entity Framework Core 1.1

Mit Entity Framework Core 1.1.1 hats danach tatsächlich keinen Fehler mehr gegeben…

Page 48: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Halte Ausschau nach Alternativen

GDI+ oder System.Net.Mailfehlen dir?

Es gibt (fast) immer eine Alternative…

Die reelle Gefahr für einen Wildwuchs an Frameworks besteht jedoch

Page 49: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Verlass dich auf nichts…

Du hast dich voll auf project.json eingestellt und findest es genial?-> Microsoft wechselt es aus mit dem XML-basierten File *.csproj

Du hast eine tolle Middleware geschrieben?-> Nach einem Update (z.B. auf 1.1.1) funktioniert sie eventuell nicht mehr..

Page 50: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Entscheide, welche Plattform du unterstützen willst…

• Gebt die richtige «RIDs» bei den Runtimes an:

Damit «dotnet publish» auch das richtige tut..

Page 51: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

CI ist (aktuell) hart, aber…

• Microsoft lässt «project.json» fallen• «csproj» für «msbuild» wird (wieder) eingeführt• Stufenabhängige Konfiguration für appsettings wieder

möglich• Entwicklung, Test, Produktion etc.

https://docs.microsoft.com/en-us/dotnet/core/tools/cli-msbuild-architecture

Page 52: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Anordnung der Middleware ist enorm wichtig

Page 53: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

(ASP).NET Core ist einfach besser…

Gegenüber ASP.NET MVC oder WebForms professioneller, wartbarer und macht einfach mehr Spass:

DependencyInjection

Identity Kestrel ServicesLogging Options Startup

Middleware Testing Entity Framework

Core

und mehr

Page 54: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

TIPPS & TRICKS

Page 55: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Hosting von ASP.NET Core auf dem IIS

• Installation vom «.NET Core Windows Server Hosting bundle»• Neustart IIS

• net stop was /y • net start w3svc

• Im Program.cs muss UseIISIntegration() ausgeführt werden:var host = new WebHostBuilder().UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartup<Startup>().Build();

Code:

Page 56: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Hosting von ASP.NET Core auf dem IIS

Konfiguration:

Deployment: (dotnet publish)

Page 57: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

ASP.NET Core auf dem IIS

• Im IIS Manager eine neue Website erstellen• Application Pool -> «No Managed Code»

• Umgebungsvariable «dotnet» muss gesetzt sein• Sonst:

IIS:

Zu beachten

Page 58: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Entity Framework DbSet-Naming-Problematik

• “EF Core: Table names now taken from DbSet names (starting in RC2)” https://github.com/aspnet/Announcements/issues/167

public DbSet<User> Users Tabellenname wird als «Users» erwartet

Umgehung:protected override void OnModelCreating(ModelBuilder modelBuilder){

foreach (var entity in modelBuilder.Model.GetEntityTypes()){

entity.Relational().TableName = entity.DisplayName();}

}

Page 59: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Entity Framework Core mit PostgreSQL

• Nuget «Npgsql»• Code kann belassen werden, wichtig aber:

protected override void OnModelCreating(ModelBuilder modelBuilder){

modelBuilder.HasPostgresExtension("uuid-ossp");}

var optionsBuilder = new DbContextOptionsBuilder();optionsBuilder.UseNpgsql("ConnectionString");

Bei der Registrierung von DI (Startup):

DbContext:

Page 60: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Generische Registrierung

• Wie komme ich zu den Assemblies nur meiner Projekte?Container.Register(typeof(ICommandHandler<>), Assembly.Load(assemblies?));

var libraries = from lib in DependencyContext.Default.RuntimeLibrarieswhere lib.Type == "project"select lib;

var assemblies = libraries.Select(name => Assembly.Load(new AssemblyName(name.Name)));

Page 61: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

Macht auch Integrationstests

• In-Memory Webserver• In-Memory DB• Akzeptanzkriterien testen• Beispiel auf meinem GitHub

• syh-42

Page 62: NET Core im Praxistest · • Beispiel Entity Framework Core (RC1, RC2, 1, 1.1, 1.1.1) • Und es werden wirklich Fehler korrigiert … “The column prefix 't0' does not match with

HERZLICHEN DANK FÜR DIE AUFMERKSAMKEITDIE FRAGERUNDE IST NUN ERÖFFNET…