【问题标题】:accessing configuration in routeattribute访问路由属性中的配置
【发布时间】:2018-04-10 14:26:33
【问题描述】:

我有这样的 API 路由属性类

public class MyRouteAttribute : RouteAttribute
{
    private const string BaseRoute = "api/default";
    private const string PrefixRouteBase = BaseRoute + "/";
    public MyRouteAttribute() : base(BaseRoute)
    {

    }
    public MyRouteAttribute(string route):
        base(string.IsNullOrEmpty(route) ?
            BaseRoute : PrefixRouteBase + route)
        {

        }

}

它在这样的控制器中使用

[MyRoute]
public class MyController : Controller
{
    .....
}

如果我必须使路由可配置,如何将IOptions 传递给 MyRoute?

例如,如果我这样做:

public class MyRouteAttribute : RouteAttribute
{
    private const string BaseRoute = "api/default";

    public MyRouteAttribute(IOptions<ApiRouteBaseConfiguration> routeOptions) : 
        base(routeOptions.Value.Url)
    {

    }

    public MyRouteAttribute(IOptions<ApiRouteBaseConfiguration> routeOptions, string route):
        base(string.IsNullOrEmpty(route) ? (routeOptions.Value.Url: $"{routeOptions.Value.Url}/" + route)
    {

    }
}

然后我在这里收到错误[MyRoute] 要求我通过IOptions

如何访问 MyRoute 属性中的配置

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    当从反射例程请求属性时,CLR 的属性实例 are created。您无法通过任何 DI 容器强制实例化属性。

    我看到了两种可能的方法来解决您的挑战。它们都允许您拥有可配置的属性,但是配置不是通过属性构造函数设置的。

    1. 更简单的方法是通过应用启动时加载的静态属性来设置配置:

      public class MyRouteAttribute : RouteAttribute
      {
          public static ApiRouteBaseConfiguration RouteConfiguration { get; } = new ApiRouteBaseConfiguration();
      
          public MyRouteAttribute() :
              base(RouteConfiguration.Url)
          {
          }
      
          public MyRouteAttribute(string route) :
              base(string.IsNullOrEmpty(route) ? RouteConfiguration.Url : $"{RouteConfiguration.Url}/" + route)
          {
          }
      }
      

      配置(配置部分在这里命名为"Routing"):

      public void ConfigureServices(IServiceCollection services)
      {
          services.AddMvc();
      
          Configuration.Bind("Routing", MyRouteAttribute.RouteConfiguration);
      }
      

      好吧,由于静态属性的使用,这个解决方案并不完美。不过这很简单,应该可以解决问题。

    2. 第二种可能的方法 - 使用属性注入模式进行属性配置并将其设置在 IApplicationModelProvider 的自定义实现中。这种方法在this answer中有描述,这里不再重复代码。

    【讨论】:

    • 谢谢,目前第一种方法是快速解决方案,我将审查第二种解决方案并对其进行处理并比较性能以决定采用哪一种。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2018-05-23
    • 2015-04-26
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多