通用控制器。我怎样才能模仿.Net Core中IHttpControllerSelector的可能性?

时间:2016-12-19 11:18:07

标签: c# asp.net-mvc generics asp.net-core

在当前的WebApi项目中,我有一个通用控制器:

public class EntityController<T>
    where T : Entity { }

如果路由中的控制器名称与类型名称匹配,则在运行时使用指定的类型创建。

例如:/api/user/初始化控制器EntityController<User>

为实现这一目标,我使用了自定义ControllerSelector:

internal class ControllerSelector : DefaultHttpControllerSelector
{
    ... other members omitted for clarity

    public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
    {
        string controllerName = base.GetControllerName(request);
        HttpControllerDescriptor descriptor;

        Type controllerType = typeof(EntityController<>).MakeGenericType(_entityTypes[controllerName]);
        descriptor = new HttpControllerDescriptor(_configuration, controllerName, controllerType);
        _descriptorCache.TryAdd(controllerName, descriptor);
        return descriptor;
    }

    ... other members omitted for clarity
}

看来这种方法无法在.Net Core中运行。

我已经找到并尝试了这些示例,但它们似乎无法解决我的问题:

  • question只会更改路线值。
  • question打印出已加载的控制器名称(但标题表明它是我需要的)。
  • 另一个问题建议创建所有可能的通用控制器的实例,以便它们可以被依赖注册引擎选中,但这感觉不对。
  • 其他问题开始指向一个定制的IRouter,但这些实现对于以前版本中容易实现的内容似乎过于复杂。

因此,使用.Net Core,如何控制控制器的创建以动态创建通用控制器?

0 个答案:

没有答案