File: RequestScopedActionConstraint.cs
Web Access
Project: src\src\Mvc\test\WebSites\BasicWebSite\BasicWebSite.csproj (BasicWebSite)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Mvc.ActionConstraints;
 
namespace BasicWebSite;
 
// Only matches when the requestId is the same as the one passed in the constructor.
public class RequestScopedConstraintAttribute : Attribute, IActionConstraintFactory
{
    private readonly string _requestId;
 
    public bool IsReusable => false;
 
    public RequestScopedConstraintAttribute(string requestId)
    {
        _requestId = requestId;
    }
 
    IActionConstraint IActionConstraintFactory.CreateInstance(IServiceProvider services)
    {
        return CreateInstanceCore(services);
    }
 
    private Constraint CreateInstanceCore(IServiceProvider services)
    {
        var constraintType = typeof(Constraint);
        return (Constraint)ActivatorUtilities.CreateInstance(services, typeof(Constraint), new[] { _requestId });
    }
 
    private class Constraint : IActionConstraint
    {
        private readonly RequestIdService _requestIdService;
        private readonly string _requestId;
 
        public Constraint(RequestIdService requestIdService, string requestId)
        {
            _requestIdService = requestIdService;
            _requestId = requestId;
        }
 
        public int Order { get; private set; }
 
        bool IActionConstraint.Accept(ActionConstraintContext context)
        {
            return AcceptCore();
        }
 
        private bool AcceptCore()
        {
            return _requestId == _requestIdService.RequestId;
        }
    }
}