I looked at this project for the first time during the Eindhoven Hackathon yesterday (which was great), and I like this project a lot.
I did notice one thing that often slips through in projects though but can be tricky, and that is concurrency checking. Perhaps I overlooked it, because one day isn't that much time to look through how a project is setup, between also talking with a lot of peers about this project and various tech, but there does not seem to be any.
The scenario to replicate this problem, should it exist, is simple. Two people look at the same task. One makes a change to, say, the name, and the other adds a required skill. Since the current setup updates the entire task, whomever presses save the last will overwrite the other's changes, and nobody will know.
EntityFramework has a simple quick concurrency check that can be added. Simply adding a Timestamp property will tell it by convention that a concurrency check should take place. It will then validate whether the Timestamp of the update that comes in mismatches the timestamp in the database, and hence know it has changed. I'm not sure if anything changed in that respect for EF7, but I presume it will work the same.
That would be the quick fix that I would recommend implementing before go-live.
A perhaps longer term fix that I'm personally fond of in CQRS scenarios is making the commands more fine-grained. If you add a skill to task, then generate a command that only does that. If you change the name, only generate a command that changes that. This avoids most concurrency issues directly and allows people to work together more concurrently as a result, which can be good when things need to move fast especially, but also makes for better quality data. And with relational data in particular, it saves you from having to retrieve say all the skills to check if something should be added or removed. Someone command to add skill x, and remove skill y, and that's all you need to do.
Of course, you can still also pass the old value in the command for maximum concurrency checking. If the old value does not match the existing value, someone has changed it in the meantime.
As an additional bonus, if you event source these fine-grained commands, you can also have a detailed change history of any entity.
I looked at this project for the first time during the Eindhoven Hackathon yesterday (which was great), and I like this project a lot.
I did notice one thing that often slips through in projects though but can be tricky, and that is concurrency checking. Perhaps I overlooked it, because one day isn't that much time to look through how a project is setup, between also talking with a lot of peers about this project and various tech, but there does not seem to be any.
The scenario to replicate this problem, should it exist, is simple. Two people look at the same task. One makes a change to, say, the name, and the other adds a required skill. Since the current setup updates the entire task, whomever presses save the last will overwrite the other's changes, and nobody will know.
EntityFramework has a simple quick concurrency check that can be added. Simply adding a Timestamp property will tell it by convention that a concurrency check should take place. It will then validate whether the Timestamp of the update that comes in mismatches the timestamp in the database, and hence know it has changed. I'm not sure if anything changed in that respect for EF7, but I presume it will work the same.
That would be the quick fix that I would recommend implementing before go-live.
A perhaps longer term fix that I'm personally fond of in CQRS scenarios is making the commands more fine-grained. If you add a skill to task, then generate a command that only does that. If you change the name, only generate a command that changes that. This avoids most concurrency issues directly and allows people to work together more concurrently as a result, which can be good when things need to move fast especially, but also makes for better quality data. And with relational data in particular, it saves you from having to retrieve say all the skills to check if something should be added or removed. Someone command to add skill x, and remove skill y, and that's all you need to do.
Of course, you can still also pass the old value in the command for maximum concurrency checking. If the old value does not match the existing value, someone has changed it in the meantime.
As an additional bonus, if you event source these fine-grained commands, you can also have a detailed change history of any entity.