Leo
Leo

Reputation: 375

.NET Core service startup configuration

I've been assigned to upscale a project built by a former coworker. I'm not a .NET Core specialist, I understand most of it as is similar to any other language, but I'm having trouble understanding the Fluent configuration made at startup.

At the Startup.cs, there is this function declared:

 public void Configure(IApplicationBuilder app)

At some point, there is an initialzation of a service that listens for something. I can manage that from the already initialized class/service, but I'd like to understand what is this:

app.UseRawRequestRequestBodyHandler(options => options
                .Handlers
                .AddRange(new[] {
                    new RawRequestHandler
                    {
                        ContentType = NotificationSubscriber.ContentType,
                        StartSegments = NotificationSubscriber.StartSegments,
                        Response = "[OK]",
                        Endpoint = new Uri(_configManager.Client.BaseAddress, "v1/payments").ToString(),
                        ModifyRequestBodyAsyncFunc = async (handler, context, bodyContent) =>
                        {
                            using (var scope = app.ApplicationServices.CreateScope())
                            {
                                var subscriber = scope.ServiceProvider
                                    .GetRequiredService<INotificationSubscriber>();
                                await subscriber.QueueAndAkcknowledgeAsync(handler, context, bodyContent);
                            }

                            return bodyContent;
                        }
                    },

I'm having special trobule with the ModifyRequestBodyAsyncFunc function, that is declared (in the interface) like this:

 public Func<RawRequestHandler, HttpContext, string, Task<string>> ModifyRequestBodyAsyncFunc { set; get; }

Also, I don't get how or where are initialized handler, context and bodyContent (RawRequestHandler handler, HttpContext context, string bodyContent as declared in the NotificationSubscriber class). I pressume these are loaded by Dependency Injection, but It would be different for other DI implementations I've seen.

Any help would be appreciated; also, I take reading recommendations.

Thank you very much!

Upvotes: 0

Views: 61

Answers (1)

edo.n
edo.n

Reputation: 2420

I'm having special trobule with the ModifyRequestBodyAsyncFunc function

This is a special C# type, called a delegate. The delegate in question is a function that accepts RawRequestHeader, HttpContext, string and returns a Task<string>, which tells us that it's asynchronous.

Next, this is a syntax to create an anonymous async function and assign it to the delegate property:

/* SomeProp */ = async (handler, context, bodyContent) =>
{
    // ...
    return bodyContent;
}

Also, I don't get how or where are initialized handler, context and bodyContent

The .UseRawRequestRequestBodyHandler(...) registers a middleware which is basically a piece of code which runs for every request. So, somewhere inside that middleware, there is code that has access to said parameters and probably passes them like that:

// the params are not necessarily named exactly like this, only the types must match
string content = await rawRequestHeader.ModifyRequestBodyAsyncFunc(handler, context, bodyContent);

Notice the await keyword (we must await asynchronous functions) and also the fact that the delegate is invoked just like a normal method.

Upvotes: 1

Related Questions