如何通过Nuget包中打包的.NET Core扩展添加路由或视图?

时间:2018-01-29 20:48:30

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

我即将构建一个应用程序,我很可能会一次又一次地为其他客户使用大部分代码。

在一个地方管理代码并且能够更新应用程序的最佳方法是将其置于私有Nuget包中。

为了实现这一点,我需要能够在控制器中使用MVC,例如[HttpGet]等 我理解如何添加我的所有服务并使它们在单例等应用程序中可用,但我找不到任何关于如何以这种方式添加端点或视图的方法?

是否有可能通过调用例如所有我的控制器等来连接services.AddMyModule()

2 个答案:

答案 0 :(得分:4)

application parts documentation章节对此进行了介绍。基本上,默认情况下,ASP.NET Core会自动从其他程序集中选择控制器,只要它们在项目中被引用即可。

因此,对于您的情况,如果项目依赖于NuGet包,并且NuGet包中包含控制器和其他应用程序部分,则应自动选择它:

  

默认情况下,MVC将搜索依赖关系树并查找控制器(即使在其他程序集中)。要加载任意程序集(例如,从编译时未引用的插件),您可以使用应用程序部件。

如果您需要对此进行更多控制并且默认设置不适合您,您仍然可以像这样明确地将程序集添加为应用程序部分:

services.AddMvc()
    .AddApplicationPart(typeof(SomeTypeInThatAssembly).Assembly);

如果您不想要默认行为,也可以显式删除程序集:

services.AddMvc()
    .ConfigureApplicationPartManager(m =>
    {
        var part = m.ApplicationParts.FirstOrDefault(p => p.Name == "AssemblyNameToRemove");

        if (part != null)
            m.ApplicationParts.Remove(part);
    });

所以基本上,如果你(和你的用户)可以使用默认行为,你可以在该程序集中定义你的控制器,你就可以了。请记住,对于要包含在程序集中的视图,您需要确保已启用view compilation

答案 1 :(得分:2)

你想要AddControllersAsServices。与AddApplicationPart结合使用,可以将它们从程序集中添加到当前的MVC实例中。我的代码看起来像

services.AddMvc()
    .AddApplicationPart(typeof(MyProject.MyNamespace.Controllers.MyController).GetTypeInfo().Assembly)
    .AddControllersAsServices();

services是我的IServiceCollection

如果您希望使用services.AddMyModule()之类的内容,则需要使用IMvcBuilder的静态扩展方法并调用上述代码。类似的东西:

public static void AddMyModule(this IMvcBuilder build)
{
    services.AddMvc().AddApplicationPart(typeof(MyProject.MyNamespace.Controllers.MyController).GetTypeInfo().Assembly)
}

编辑: 正如戳指出的那样,AddControllersAsServices可以具有更广泛的效果,而不仅仅是在列表中添加控制器。所以我从答案中删除了它。