繁体   English   中英

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

[英]How to add routes or views by .NET Core extension packed in Nuget package?

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

在一处管理代码并能够更新应用程序的最佳方法是将其放在私有的Nuget软件包中。

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

是否可以通过调用例如services.AddMyModule()来附加我所有的控制器等?

应用程序零件文档一章对此进行了介绍。 基本上,默认情况下,只要在项目中引用了其他程序集,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);
    });

因此,基本上,如果您(和您的用户)可以使用默认行为,则只需在该程序集中定义控制器就可以了。 请记住,要使视图包含在装配中,您需要确保已启用视图编译

您需要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可以具有比仅在列表中添加控制器更广泛的影响范围。 因此,我已将其从答案中删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM