以编程方式创建控制器

时间:2017-07-07 11:12:29

标签: c# asp.net asp.net-core asp.net-core-webapi

已经决定我们应该在不同的应用程序之间有一个共同的上传http api。我有一个文件上传控制器,我想在多个webapi项目中使用。

我的上传控制器看起来像这样

namespace MyNamespace
{
    [Authorize("PolicyName")]
    [Route("Upload")]
    public class UploadController : Controller
    {
        [HttpPost]
        [Route("Upload")]
        public async Task<IActionResult> Upload(UploadModel model)
        {
             // impl..
             return Ok();
        }
    }
}

天真的我以为我只是将它提取到一个类库中,我可以注册它,但我找不到怎么样?

无论如何,我不认为这是正确的使用方法。我希望能够配置授权策略名称,并可能配置路由。所以我想我想建立控制器,它的路由和授权设置并注册一些如何?

我对api的想法就像..

((IApplicationBuilder)app).UseUploadController(config => {
    config.PolicyName = "Whatever",
    config.UploadRoute = "UploadStuff"
});

...这将创建并注册控制器。不知道从哪里开始。我完全不知道如何发现控制器或者是否可以以编程方式注册它们。

任何人都有任何指针或图书馆可以寻找灵感?

2 个答案:

答案 0 :(得分:1)

您可以将控制器放在您引用的类库中(如您所愿),然后在任何项目中,您可以从该控制器继承所需的控制器。如果您不想要任何其他功能,可以将子类留空,但如果您想添加某些内容,则可以轻松扩展它。 此外,您可以拥有控制器的任何其他名称,并可以设置不同的路由,授权等。

答案 1 :(得分:0)

如果您在不同的程序集中有一个控制器,那么您可以通过添加适当的引用和修改路由来让MVC应用程序发现它,如this answer中所述

对于配置,传递给属性的值需要是编译时常量,因此在运行MVC应用程序时无法动态设置它们。您可以创建实现逻辑的自定义属性。所以对于Authorize你会有这样的东西:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class SetPermissionsAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // Get everyting you need, for example from Web.config
    }

    (...)
}

如代码段注释中所述,不同的应用程序可以存储动态值,例如Web.config设置,您可以在属性中读取这些值。

Example自定义AuthorizeAttribute