Build Libraries, Not Frameworks

31
BUILD LIBRARIES, NOT FRAMEWORKS Or how to build packages that people want to use Dennis Doomen | @ddoomen

Transcript of Build Libraries, Not Frameworks

Page 1: Build Libraries, Not Frameworks

BUILD LIBRARIES, NOT FRAMEWORKSOr how to build packages that people want to use

Dennis Doomen | @ddoomen

Page 3: Build Libraries, Not Frameworks

…and badly designed libraries

Page 4: Build Libraries, Not Frameworks
Page 5: Build Libraries, Not Frameworks
Page 6: Build Libraries, Not Frameworks
Page 7: Build Libraries, Not Frameworks
Page 8: Build Libraries, Not Frameworks
Page 9: Build Libraries, Not Frameworks
Page 10: Build Libraries, Not Frameworks
Page 11: Build Libraries, Not Frameworks
Page 12: Build Libraries, Not Frameworks
Page 13: Build Libraries, Not Frameworks

Library Consumer

Bunch of classes that should be used directly

X

No inheritance

Uses composition over inheritance

internally

Convenience classes that don’t hide the

magic

Main Package

Contract Package

Contract

Contract

Only depend on abstract packages…

Stable Package

…or depend on more stable packages

Auxiliary Package

Classes that are not used together do not

belong togetherOptional Dependency

DependencyPackage

Consumers should not be faced with

optional dependencies

Page 14: Build Libraries, Not Frameworks
Page 15: Build Libraries, Not Frameworks
Page 16: Build Libraries, Not Frameworks
Page 17: Build Libraries, Not Frameworks
Page 18: Build Libraries, Not Frameworks
Page 19: Build Libraries, Not Frameworks
Page 20: Build Libraries, Not Frameworks
Page 21: Build Libraries, Not Frameworks
Page 22: Build Libraries, Not Frameworks

public interface IEventStore{

IDisposable Subscribe(long? lastCheckpoint, Func<Transaction[]>, Task> handler,string subscriptionId);

}

public delegate IDisposable CreateSubscription(long? lastCheckpoint,Func<Transaction[]>, Task> handler,string subscriptionId);

Page 24: Build Libraries, Not Frameworks
Page 25: Build Libraries, Not Frameworks
Page 26: Build Libraries, Not Frameworks
Page 27: Build Libraries, Not Frameworks

Command Handlers

Commands

Domain Model

Event Store

Events

App

PersistentProjections

RavenDB/Nhibernate/Raw SQL

ProjectorsEvents

API Controller

Projections

Events

Page 28: Build Libraries, Not Frameworks

Library Consumer

LiquidProjections

LiquidProjections.Abstractions

Transaction

Delegates

LiquidProjections. NEventStore

NHibernate

LiquidProjectionsNHibernate

RavenDB

LiquidProjectionsRavenDB

LiquidProjections. Testing

Page 29: Build Libraries, Not Frameworks
Page 30: Build Libraries, Not Frameworks

• Liquid Projections – The Examplehttps://github.com/liquidprojections

• Principal for Successful Package Managementhttp://www.continuousimprover.com/2016/10/principles-for-successful-package.html

• The magic of hiding your NuGet dependencieshttp://www.continuousimprover.com/2016/05/the-magic-of-hiding-your-nuget.html

• To DRY or not to DRY, it is a matter of boundarieshttp://www.continuousimprover.com/2016/05/the-magic-of-hiding-your-nuget.html

• 12 tips to write unit tests that don’t cripple your code basehttp://www.continuousimprover.com/2015/11/12-tips-to-write-unit-tests-that-dont.html