Skip to main content

Control the execution order of your attributes through [CallerLineNumber]

In HotChocolate, the GraphQL library I use most of the time, you have the concept of field middleware. It allows you to create reusable logic that will be executed before or after a field resolver.

A typical example of built-in field middleware is the support for pagination, filtering and sorting. When executing this middleware, there is a logical order in which you expect this middleware to be executed. For example, you expect that first the returned data will be filtered and then be paginated.

In a code-first approach this would look like this:

Remark: if you are wondering if this shouldn't be defined the other way around, have a look at this image that can also be found in the documentation:

You can do the same thing using an annotation-based approach:

When I first saw this code, I was wondering how this could uberhaupt work. I know that in .NET the attribute order should not be respected by the compiler. So although we specified [UsePaging] first and [UseFiltering] second, there is no guarantee that this will be the order in which this field middleware is executed.

So why don’t I see any remarks about this in the documentation?

[CallerLineNumber] magic

A look at the source code brought me the answer. If you look at the constructor of the attribute, you could see an order argument annotated with the [CallerLineNumber] attribute:

The [CallerLineNumber] attribute allows you to obtain the line number in the source file at which the method is called.

By using the line number as our order value, the order in which our attributes are added is respected when executing the field middleware.

Clever!

Popular posts from this blog

DevToys–A swiss army knife for developers

As a developer there are a lot of small tasks you need to do as part of your coding, debugging and testing activities.  DevToys is an offline windows app that tries to help you with these tasks. Instead of using different websites you get a fully offline experience offering help for a large list of tasks. Many tools are available. Here is the current list: Converters JSON <> YAML Timestamp Number Base Cron Parser Encoders / Decoders HTML URL Base64 Text & Image GZip JWT Decoder Formatters JSON SQL XML Generators Hash (MD5, SHA1, SHA256, SHA512) UUID 1 and 4 Lorem Ipsum Checksum Text Escape / Unescape Inspector & Case Converter Regex Tester Text Comparer XML Validator Markdown Preview Graphic Color B

Help! I accidently enabled HSTS–on localhost

I ran into an issue after accidently enabling HSTS for a website on localhost. This was not an issue for the original website that was running in IIS and had a certificate configured. But when I tried to run an Angular app a little bit later on http://localhost:4200 the browser redirected me immediately to https://localhost . Whoops! That was not what I wanted in this case. To fix it, you need to go the network settings of your browser, there are available at: chrome://net-internals/#hsts edge://net-internals/#hsts brave://net-internals/#hsts Enter ‘localhost’ in the domain textbox under the Delete domain security policies section and hit Delete . That should do the trick…

Azure DevOps/ GitHub emoji

I’m really bad at remembering emoji’s. So here is cheat sheet with all emoji’s that can be used in tools that support the github emoji markdown markup: All credits go to rcaviers who created this list.