-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add design for interceptors with nonzero arity #68218
Closed
RikkiGibson
wants to merge
1
commit into
dotnet:features/interceptors
from
RikkiGibson:ic-arity-design
Closed
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We need to resolve this issue to fix dotnet/aspnetcore#47338. The methods we're trying to intercept in ASP.NET Core were never generic to begin with. We want the interceptor method to capture the generic parameter from an outer scope that was never passed to the original intercepted method, so the arity will be different.
Take the examples I originally posted in the ASP.NET Core issue:
The original
MapPost
has a generic arity of zero. The goal was to be able to define aMapPost<TUser>(IEndpointRouteBuilder app, string pattern, Delegate handler)
so we could then useTUser
in the generated code to resolve the arguments and serialize the response correctly.Of course, for
TUser
to be inferred at these call sites,MapPost<TUser>
would need to take anAction<UserManager<TUser>>
orFunc<TUser>
respectively, rather than aDelegate
like it does in the current PR to make ASP.NET Core use this feature at dotnet/aspnetcore#48555.Looking at the signature matching part of this document, it appears arguments have to match the original method arguments exactly rather than take a more specific type. It'd be nice if we could relax that if we could statically prove that the call site will always use a more specific type that the interceptor accepts.
Here's an example that demonstrates the need for the interceptor to change the parameter type from
Delegate
toFunc<T2>
for type inference to work.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, this is good information and it's a tricky scenario. Is it safe to assume that we can't know the full set of possible type arguments to
TestGenericResponse<TUser>
in advance? (letting us possibly test and branch on the type of the return value.)There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unfortunately, it's not safe to assume we can discover the full set of type arguments at compile time. I discovered this issue working on
MapIdentityApi<TUser>()
where theTUser
is provided by the consumer of the library.