簡體   English   中英

Asp.Net核心中是否有任何可擴展性點,可以在startup.cs以外的任何地方注冊服務?

[英]Is there any extensibility point in Asp.Net core to register services anywhere other than startup.cs?

基本上在Asp.Net Core我們在startups.cs文件中注冊服務。 現在的問題是, Asp.Net Core是否有任何可擴展性點,這使我們有機會加入某種注冊方法(例如,通過實現特定的接口),並且不會搞砸startup.cs

避免搞亂Startup

如果只想避免在Startup.cs造成混亂,只需將服務注冊邏輯委托給另一個方法(可能在另一個靜態類中)即可。

ServiceRegistry.RegisterAllServices(services);

涉足ASP.Net啟動管道

如果您真的想闖入ASP.Net的啟動邏輯,恐怕運氣不好。 ServicesCollection的構建在BuildCommonServices方法中進行。 如您所見,這里沒有簡單的方法可以掛接到邏輯上。

簡而言之,啟動ASP.Net應用程序時會發生以下情況:

  1. .Net core ,只有一個應用程序模型-控制台應用程序; 所以稱Main
  2. 發生了一些魔術,我們到達了StartupLoader.LoadMethods
  3. 三種方法位於ConfigureConfigureContainerConfigureServices
  4. 所有這三個查找都傳遞給FindMethod ,該方法始終僅在startupTypestartupType 參考

啟動后如何注冊服務

將其他服務注冊到ASP.Net Core附帶的IOC Container中並ASP.Net Core

DI框架本身是非常基礎的,如果您發現自己做的事情不那么瑣碎,則可能應該將自己升級為更成熟且功能完善的IOC Container

您可以在GitHub上的aspnet / DependencyInjection存儲庫上的README文件中找到一些鏈接。

不過,我必須指出,在創建容器之后注冊服務被認為是一種不好的做法。

這里已經很好的答案了,但是只是添加我的2c。

我認為您本質上在尋找的是“配置文件”或“模塊”之類的東西,並且IOC會進行程序集掃描。 您已經可以執行此操作,但是您需要創建自己的界面/反射代碼。

另一種選擇是使用ServiceCollection Extension模式,這似乎是添加“服務”的默認方法。

例如,使用以下代碼:

public static class ServicesConfiguration
{
    public static void AddCustomServices(this IServiceCollection services)
    {
        services.AddTransient<IMyService, MyService>();
    }
}

然后,您的Configure Services方法將更像:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddCustomServices();
}

從某些方面來說,我更喜歡這樣做,因為您仍然可以一目了然地看到正在加載的內容並按照路線行駛,而不是進行一些神秘的思考。

進一步的閱讀: http : //dotnetcoretutorials.com/2017/01/24/servicecollection-extension-pattern/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM