繁体   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