簡體   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