Well, it's not just about laziness but saving time and possible errors. I often have to create .NET models, sometimes with many properties (20-30+), and also a custom DB entity that basically uses the same properties. After a while I realized that the process should be made simpler, where I just need to set the input data.
Previously we (including our team) were manually duplicated existing files, and then copy-pasted DB field names and adjusted a few things. I took this step forward as I could copy DB field names (each in one line) then applied a regex search-replace and partly I was done. But I had to do this 4 times each occasion, and then still had to adjust some things and hope everything would be OK.
Update: check out the follow-up post about rewriting the application with Mithril.js (includes a demo as well).
Choosing the weapon
The first tool that came to my mind was Eleventy. I could use PHP or a simple JavaScript application as well, but Eleventy seemed the best for this purpose. It's a static site generator that usually spits out .html files, but that's not hardcoded. I wanted .cs files, and that's only a matter of setting permalinks that ends with this extension.
Setting up
First I created one directory per model, where I added two template files: one for a model, and one for the custom DB entity. I added a .json file as well, containing all the input data (property names, types, namespace, etc). After some fiddling around I got the result I needed: two output files that matched my expectations.
I added a few nice-to-have features as well, like generating "nice" display names (eg. "PackageCode" => "Package Code"), automatically setting the right method for getting the value (eg. "GetSafeDateTime" for the "DateTime" type properties), etc). I wouldn't like to overcomplicate things because this is only a boilerplate generator to get started fast.
Fine-tuning
I was happy with the results and wrote a small documentation to it. While doing so I realized that I could probably merge all these files into one. The only problem was that I had no clue how to output several files from one template in Eleventy. I almost granted for sure that it was not possible, but on GitHub I saw a few lines about using pagination to achieve such a thing. It took me some time to grasp the concept (getting old?), but finally I succeeded.
Here is a sample Nunjucks template (only contains a front matter part since template logic is in the layout file):
---json
{
"classNames": [
"MyModel",
"VW_TWS_MY_MODEL"
],
"properties": {
"Address": ["string"],
"PackageCode": ["string", false, "PKGCODE"],
"Registered": ["DateTime?"],
"UserId": ["int"],
"UserName": ["string"]
},
"namespace": "Infrastructure.Core.Models.MyModels",
"customDbEntityName": "wkResult",
"WARNING": "--- DO NOT EDIT BELOW ---",
"pagination": {
"data": "classNames",
"size": 1
},
"layout": "layouts/default.njk",
"permalink": "/dotnet-model-generator-with-eleventy/.cs"
}
---
Nuisances
I don't really like that for this tool I need 104 Mb of npm packages, but that's how it works. Plus one needs node.js installed as well. Because of this, perhaps a JavaScript tool would have been a better choice.
TL;DR
As it turned out, Eleventy is a great tool for generating files that are feeded with data, let it be .html or other file type. For this model generator it's only a matter of supplying the right input data and get the results in a fraction of a second.
0 comments Comments