Our tech stack - choosing the right .NET open source tools
Topics: DrDoctor tech
At DrDoctor we're on a .NET stack (and we're Bizspark members) but that doesn't mean we don't love open source tools - what we want is the right tools - and the .NET world is full of them. We've used a few and I thought it might be useful for people to see what choices we've made. So here goes:
- RabbitMQ. Correct, it's not MS, but at no point did we ever consider using MSMQ. It's an awesome messaging infrastructure with a great .NET client. It works and it works well.
- EasyNetQ Fantastic light-weight, open source Bus implementation on top of RabbitMQ. It's actively developed, well documented and we got it working in about two days. It's at a 0.x release at the moment, so breaking changes do happen, which means we've taken a cut of the code that we're happy with (I possibly managed to push a breaking change into our build before I realised this ;) ). Hopefully at some point we can contribute something back.
- Topshelf Makes working with Windows Services a pleasure. It's used by a lot of other projects (e.g. NServiceBus) because it's great.
- Castle Windsor Powerful IoC with a tonne of well written documentation.
- Magnum library We only we use one thing from this library (the State Machine) but it's at the core of our business logic. Created by the same guys who brought you Topshelf (see above). Almost non-existent documentation, but really handy utilities.
- Simple Data Mark Rendle's rather excellent data access library (we use it on top of SQL Server).
- NancyFX Nice light-weight web framework (an alternative to MS's WebAPI and MVC frameworks).
Of those seven tools I'd say that easyNetQ, Topshelf, Magnum & Simple Data are all about developer productivity. Simply put, they are tools that allow us as developers to work on business features rather than infrastructure.
NancyFX is awesome for productivity and testing, feels more like the Python/Rails world and doesn't carry all the kludge that comes with the .NET MVC/WebAPI frameworks. Seriously, I don't need the Entity Framework stuff. I really, really don't.
RabbitMQ is a fundamental architectural choice. DrDoctor is event driven by its very nature, so a messaging infrastructure fits perfectly. It also leads to a clean separation of concerns with components that communicate via RabbitMQ in an asynchronous fashion. This in turn leads to a much easier development and deployment cycle: if we're working on our appointment management logic and need to deploy an update it's one component that needs to come down, while our entire application remains up. SOA baked in from the start.
Which really just leaves Castle. There are loads of IoC containers out there, we just happen to feel most comfortable with Castle.