【问题标题】:How to properly call a method at startup in Asp .Net Core?如何在 Asp .Net Core 启动时正确调用方法?
【发布时间】:2020-02-04 16:17:00
【问题描述】:

我想在我现在正在处理的 Asp .Net Core 项目中重用我为 Asp .Net Framework 中的一些项目创建的库类。

对于该项目,我必须使用 MySQL 数据库,因此我将 MySqlConnector NuGet 包添加到我的库类中。

由于注册的 .NET 数据提供程序不会自动添加到全局程序集缓存中,因此我必须手动注册它,这要感谢在应用程序启动期间调用该方法 DbProviderFactories.RegisterFactory("MySqlConnector", MySqlClientFactory.Instance),如提及 here

这是我的第一个 .Net 核心项目,所以我不知道我是否应该这样做,但我在 Startup.cs 文件中调用了该方法,如下所示:

它正在工作,但我想知道这是否是正确的方法。你能告诉我另一种正确的方法吗?

谢谢

【问题讨论】:

    标签: asp.net-core


    【解决方案1】:

    IMO,您的方法根本没有问题。 我看到的一个问题是您尝试运行的任务需要太长时间,在这种情况下,您最好生成一个任务。 另一个是可重用性,你的代码是耦合在一起的。您可以通过将其包装在一个类中并通过接口将其注入到中间件组件中,然后调用一个方法来解决这个问题。例如:

    public interface ITask { void Run(); }
    
    class RegisterMySqlTask : ITask { public void Run() { DbProviderFactories.RegisterFactory("MySqlConnector", MySqlClientFactory.Instance); } }
    
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<ITask, RegisterMySqlTask>();
        //rest goes here
    }
    
    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            context.RequestServices.GetRequiredService<ITask>().Run();
            await next(context);
        });
    
        //rest goes here
    }
    

    但是请注意,这可能会使事情变得过于复杂。正如我所说,我相信你没有做错任何事。

    【讨论】:

    • Gosh “许多”行来替换一个 :-) 我从来没有见过这样的代码。当我发现 .Net Core 时,它​​可能会变得更清楚,老实说,我想到了一个单例,但作为注册提供者的方法是一种静态方法,我不知道如何用它来制作单例,谢谢你的回答里卡多
    • 我对文档进行了一些研究..我遵循了您的建议并创建了一个中间件组件..生成的代码与您的不同,但它可以工作.. .Net Core 使用单个实例处理多个请求的中间件组件,因此在这种特殊情况下非常完美。再次感谢 Ricardo :-)
    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多