SlideShare ist ein Scribd-Unternehmen logo
The Pain of Choice
Was in keinem Repertoire fehlen darf…

Fabian Deitelhoff

>>> dotnet-developer-conference.de

#ddc13
Ressourcen

Alle Beispiele sind online verfügbar
https://github.com/Twainsoft/Twainsoft.Talks.DDC13.Libs

>>> dotnet-developer-conference.de

#ddc13
…Warum Bibliotheken kennen?

Das berühmte Rad…
…nutzen. Nicht neu erfinden!

>>> dotnet-developer-conference.de

#ddc13
…Warum Bibliotheken kennen?

Neues kennenlernen
Insbesondere Eindrücke und Ideen zu Problemstellungen.

>>> dotnet-developer-conference.de

#ddc13
…Warum Bibliotheken kennen?

Wichtig
Oftmals reicht schon das Wissen aus, dass es etwas gibt!

>>> dotnet-developer-conference.de

#ddc13
…Warum Bibliotheken kennen?

Wichtig
Zum Einsatz kommen kann es ruhig später.

>>> dotnet-developer-conference.de

#ddc13
…Disclaimer! 

Was mir wichtig ist!
Das hier sind alles Beispiele. Bibliotheken gibt es viele.

>>> dotnet-developer-conference.de

#ddc13
…LibZ?

Zusammen ist doch schöner…
Projekte bestehen in der Regel aus vielen Dateien.

>>> dotnet-developer-conference.de

#ddc13
…LibZ?

Während der Entwicklung?
Normalerweise nicht das Problem. Die IDE macht das schon…

>>> dotnet-developer-conference.de

#ddc13
…LibZ?

Und beim Ausliefern?
Das nervt schon mehr…

>>> dotnet-developer-conference.de

#ddc13
…LibZ?

Mergen ist eine Lösung
Assemblies beim Buildvorgang zu einer zusammenfassen.

>>> dotnet-developer-conference.de

#ddc13
…LibZ?

LibZ
Kommandozeilentool zum Injizieren von Assemblies.

>>> dotnet-developer-conference.de

#ddc13
…LibZ?

LibZ
Direktes Injizieren oder über Container.

>>> dotnet-developer-conference.de

#ddc13
…LibZ?

LibZ
Verschiedene Kompressionsalgorithmen.

>>> dotnet-developer-conference.de

#ddc13
…LibZ?
LibZ
Einfaches Injizieren über eine Anweisung möglich.

set LIBZ="$(SolutionDir)packagesLibZ.Bootstrap.1.0.3.7toolslibz.exe"

%LIBZ% inject-dll --assembly $(TargetFileName) --include *.dll
--exclude LibZ.Bootstrap.dll --move

>>> dotnet-developer-conference.de

#ddc13
…LibZ?

LibZ
Einsatz von Container erfordert einige zusätzliche Anweisungen.

%LIBZ% add --libz DemoSuite.libz --include *.dll
--exclude LibZ.Bootstrap.dll --codec deflate –move
%LIBZ% inject-libz -assembly $(TargetFileName) --libz DemoSuite.libz –move
%LIBZ% instrument --assembly $(TargetFileName) --libz-resources

>>> dotnet-developer-conference.de

#ddc13
…LibZ?

Demo
Mergen von Assemblies.

>>> dotnet-developer-conference.de

#ddc13
…LibZ?

Was es nicht ist!
Keine Obfuskierung der Assemblies.

>>> dotnet-developer-conference.de

#ddc13
…NuDoc?

Verarbeitet XML-Kommentare
Stellt eine simple API bereit.

>>> dotnet-developer-conference.de

#ddc13
…NuDoc?

Verarbeitet XML-Kommentare
Einlesen als XML-Datei. Angabe der Assembly optional.

>>> dotnet-developer-conference.de

#ddc13
…NuDoc?
static void Main()
{
var docReader = DocReader.Read("ClariusLabs.NuDoc.xml");
docReader.Accept(new MarkdownVisitor("ausgabe-ohne-reflection.md"));
}

static void Main()
{
var docReader = DocReader.Read(Assembly.LoadFrom("ClariusLabs.NuDoc.dll"));
docReader.Accept(new MarkdownVisitor("ausgabe-mit-reflection.md"));
}

>>> dotnet-developer-conference.de

#ddc13
…NuDoc?

Vorteil der zweiten Variante
NuDoc reichert das in-memory Modell mit Informationen an.

>>> dotnet-developer-conference.de

#ddc13
…NuDoc?

Einfache Verarbeitung
Basis bilden das Visitor- und das Composite-Pattern.

>>> dotnet-developer-conference.de

#ddc13
…NuDoc?

Einfache Verarbeitung
Jedes Element ist „besuchbar“.

>>> dotnet-developer-conference.de

#ddc13
…NuDoc?

Einfache Verarbeitung
Bei der Implementierung wird entschieden, was wichtig ist.

>>> dotnet-developer-conference.de

#ddc13
…NuDoc?

Demo
XML-Kommentare zu Markdown.

>>> dotnet-developer-conference.de

#ddc13
…FluentAssertions?

Flüssigere Behauptungen
Erlaubt das Schreiben von Tests im TDD-Style.

>>> dotnet-developer-conference.de

#ddc13
…FluentAssertions?

Flüssigere Behauptungen
Testergebnisse einfacher und natürlicher definieren.

>>> dotnet-developer-conference.de

#ddc13
…FluentAssertions?

Fluent Interfaces
Intensiver Gebrauch für eine natürlichere Definition.

>>> dotnet-developer-conference.de

#ddc13
…FluentAssertions?

Erweiterungsmethoden
Für alle denkbaren Typen für eine einfache Anwendung.

>>> dotnet-developer-conference.de

#ddc13
…FluentAssertions?
"Hallo Welt"
.Should()
.Be("Hallo welt");
Expected string to be "Hallo welt", but "Hallo
Welt" differs near "Wel" (index 6).
Expected string to be "Hallo welt2" with a length
of 11, but "Hallo Welt" has a length of 10.

>>> dotnet-developer-conference.de

#ddc13
…FluentAssertions?

Kombinationen
Auch Kombinationen von Bedingungen sind möglich.

>>> dotnet-developer-conference.de

#ddc13
…FluentAssertions?
"Hallo Welt"
.Should()
.Be("Hallo Welt")
.And.EndWith("T");
Expected string "Hallo Welt" to end with "T".

>>> dotnet-developer-conference.de

#ddc13
…FluentAssertions?

Demo
String, Collection, Numeric, DateTime, Exception

>>> dotnet-developer-conference.de

#ddc13
…FluentAssertions?

Eine unter vielen
Es gibt viele Fluent Assertion Bibliotheken. Anschauen lohnt sich!

>>> dotnet-developer-conference.de

#ddc13
…FeatureSwitcher?

Der „Umschalter“
Funktion A für Kunde A, Funktion B für Kunde B…

>>> dotnet-developer-conference.de

#ddc13
…FeatureSwitcher?

Das ist gar nicht so einfach…
Mögliche Lösungen sind Lizenzen, Branches, Feature Toggle.

>>> dotnet-developer-conference.de

#ddc13
…FeatureSwitcher?

Feature Toggle
Konfigurierbare Schalter für Funktionen (Martin Fowler).

>>> dotnet-developer-conference.de

#ddc13
…FeatureSwitcher?

Feature Toggle
Konfigurierbar ist das Schlüsselwort (zur Laufzeit).

>>> dotnet-developer-conference.de

#ddc13
…FeatureSwitcher?
Einfaches Beispiel
Abfrage eines Features anhand des Typs.
Features.Are.ConfiguredBy.Custom(Features.OfType<Colorize>.Enabled);
if (Feature<Colorize>.Is().Enabled)
{
Console.BackgroundColor = ConsoleColor.Blue;
Console.ForegroundColor = ConsoleColor.Yellow;
}

>>> dotnet-developer-conference.de

#ddc13
…FeatureSwitcher?

Besonderheiten
Keine Strings, Typabfrage und ein einfacher Syntax.

>>> dotnet-developer-conference.de

#ddc13
…FeatureSwitcher?

Demo
Abfragen eines Features, Konfigurationen.

>>> dotnet-developer-conference.de

#ddc13
…FeatureSwitcher?

Aufpassen
Feature Toggles sind toll. Allerdings nicht immer.

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

Lizensieren…
…will gelernt sein.

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

Lizenzen
Können einen Anwender echt nerven…

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

Lizenzen
Wenn überhaupt notwendig, so transparent wie möglich.

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

Bibliotheken nutzen
Keine Gute Idee, das Rad neu zu erfinden!

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

Warum Portable.Licensing?
Wenig Code notwendig. Viele Funktionen. Schnelle Integration.

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

Warum Portable.Licensing?
Public-Key-Verschlüsselungsverfahren

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

Nur drei Schritte notwendig
Schlüssel erzeugen, Lizenz erzeugen, Lizenz laden

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

1. Schlüssel erzeugen
Features.Are.ConfiguredBy.Custom(Features.OfType<Colorize>.Enabled);
var keyGenerator = Portable.Licensing.Security.Cryptography.KeyGenerator.Create();
var keyPair = keyGenerator.GenerateKeyPair();
PrivateKey = keyPair.ToEncryptedPrivateKeyString(password.Text.Trim());
PublicKey = keyPair.ToPublicKeyString();

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

2. Lizenz erzeugen
eatures.Are.ConfiguredBy.Custom(Features.OfType<Colorize>.Enabled);
var license = License.New()
.WithUniqueIdentifier(Guid.NewGuid())
.As(LicenseType.Trial)
.ExpiresAt(DateTime.Now.AddDays(30))
.CreateAndSignWithPrivateKey(PrivateKey, password);

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

3. Lizenz laden
eatures.Are.ConfiguredBy.Custom(Features.OfType<Colorize>.Enabled);
using (var streamReader = new StreamReader("License.lic"))
{
license = License.Load(streamReader);
}

>>> dotnet-developer-conference.de

#ddc13
… Portable.Licensing?

Demo
Eine kleine und vollständige Anwendung.

>>> dotnet-developer-conference.de

#ddc13
The Pain of Choice

Noch Fragen?

>>> dotnet-developer-conference.de

#ddc13
Vielleicht noch interessant…

BouncyCastle

>>> dotnet-developer-conference.de

#ddc13
The Pain of Choice

Vielen Dank für die Aufmerksamkeit!
Viel Spaß noch auf der #DDC13!

>>> dotnet-developer-conference.de

#ddc13
The Pain of Choice
Fabian Deitelhoff
Student, Master of Science Informatik
Schwerpunkt Biomedizinische Informatik
Autor, Speaker, Softwareentwickler

Kontaktinformationen
E-Mail: Fabian@FabianDeitelhoff.de
Twitter: @FDeitelhoff
Blog:
http://www.fabiandeitelhoff.de

>>> dotnet-developer-conference.de

#ddc13
Ressourcen und Quellen
LibZ
http://libz.codeplex.com/

NuDoc
https://github.com/clariuslabs/NuDoc

FluentAssertions
https://github.com/dennisdoomen/FluentAssertions

FeatureSwitcher
https://github.com/mexx/FeatureSwitcher

Portable.Licensing
https://github.com/dnauck/Portable.Licensing
>>> dotnet-developer-conference.de

#ddc13

Weitere ähnliche Inhalte

Ähnlich wie The pain of choice - Important libs for C# developers

AdminCamp 2011 Performance
AdminCamp 2011 PerformanceAdminCamp 2011 Performance
AdminCamp 2011 Performance
Ulrich Krause
 
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHDocker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
agilemethoden
 
DNUG ak-anwendungsentwicklung.18042011
DNUG ak-anwendungsentwicklung.18042011DNUG ak-anwendungsentwicklung.18042011
DNUG ak-anwendungsentwicklung.18042011
Ulrich Krause
 
Augmented Reality Workshop
Augmented Reality WorkshopAugmented Reality Workshop
Augmented Reality Workshop
argency
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
Josef Adersberger
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
QAware GmbH
 
AdminCamp 2014: Client Performance - Probleme verstehen und beheben
AdminCamp 2014: Client Performance - Probleme verstehen und behebenAdminCamp 2014: Client Performance - Probleme verstehen und beheben
AdminCamp 2014: Client Performance - Probleme verstehen und beheben
panagenda
 
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-AnwendungBack to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
MongoDB
 
Rex - Infrastruktur als Code
Rex - Infrastruktur als CodeRex - Infrastruktur als Code
Rex - Infrastruktur als Code
Jan Gehring
 
Forms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsForms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and Operations
Torsten Kleiber
 
docker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easydocker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easy
inovex GmbH
 
objectiF extrem
objectiF extremobjectiF extrem
objectiF extrem
Olaf Lewitz
 
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
Christian Mücke
 
Grundlagen puppet
Grundlagen puppetGrundlagen puppet
Grundlagen puppet
inovex GmbH
 
Dokumentation schreiben kann spass machen
Dokumentation schreiben kann spass machenDokumentation schreiben kann spass machen
Dokumentation schreiben kann spass machen
Sebastian Hempel
 
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Gregor Biswanger
 
JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013
Oliver Zeigermann
 
Einführung in Docker
Einführung in DockerEinführung in Docker
Einführung in Docker
Christian Colbach
 
Top 10 Internet Trends 2006
Top 10 Internet Trends 2006Top 10 Internet Trends 2006
Top 10 Internet Trends 2006
Jürg Stuker
 

Ähnlich wie The pain of choice - Important libs for C# developers (20)

AdminCamp 2011 Performance
AdminCamp 2011 PerformanceAdminCamp 2011 Performance
AdminCamp 2011 Performance
 
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHDocker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
 
DNUG ak-anwendungsentwicklung.18042011
DNUG ak-anwendungsentwicklung.18042011DNUG ak-anwendungsentwicklung.18042011
DNUG ak-anwendungsentwicklung.18042011
 
Augmented Reality Workshop
Augmented Reality WorkshopAugmented Reality Workshop
Augmented Reality Workshop
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
AdminCamp 2014: Client Performance - Probleme verstehen und beheben
AdminCamp 2014: Client Performance - Probleme verstehen und behebenAdminCamp 2014: Client Performance - Probleme verstehen und beheben
AdminCamp 2014: Client Performance - Probleme verstehen und beheben
 
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-AnwendungBack to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
Back to Basics – Webinar 2: Ihre erste MongoDB-Anwendung
 
Rex - Infrastruktur als Code
Rex - Infrastruktur als CodeRex - Infrastruktur als Code
Rex - Infrastruktur als Code
 
NoSQL with MySQL
NoSQL with MySQLNoSQL with MySQL
NoSQL with MySQL
 
Forms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and OperationsForms and Reports 12c - Processes and Automation in Development and Operations
Forms and Reports 12c - Processes and Automation in Development and Operations
 
docker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easydocker.io - Secure And Portable Containers Made Easy
docker.io - Secure And Portable Containers Made Easy
 
objectiF extrem
objectiF extremobjectiF extrem
objectiF extrem
 
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
 
Grundlagen puppet
Grundlagen puppetGrundlagen puppet
Grundlagen puppet
 
Dokumentation schreiben kann spass machen
Dokumentation schreiben kann spass machenDokumentation schreiben kann spass machen
Dokumentation schreiben kann spass machen
 
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
 
JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013JavaScript für Java-Entwickler W-JAX 2013
JavaScript für Java-Entwickler W-JAX 2013
 
Einführung in Docker
Einführung in DockerEinführung in Docker
Einführung in Docker
 
Top 10 Internet Trends 2006
Top 10 Internet Trends 2006Top 10 Internet Trends 2006
Top 10 Internet Trends 2006
 

The pain of choice - Important libs for C# developers