首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么注册MysqlConnection为服务?

为什么注册MysqlConnection为服务?
EN

Stack Overflow用户
提问于 2022-05-06 07:18:06
回答 2查看 306关注 0票数 0

我正在努力学习asp.net的核心6.0,我有一个网站,我正在工作。我需要一个mysql连接在我的网站上。我打开谷歌,开始搜索。我写了一个代码,它工作没有任何问题;

代码语言:javascript
复制
using (var con = new MySqlConnection("server=127.0.0.1;user=dbuser;password=123456;database=gamedata")) {
    con.Open();
    MySqlCommand command = new MySqlCommand("SELECT * FROM userdata WHERE id=7", con);
    var o = command.ExecuteReader();
    if (o.Read()) {
        Console.WriteLine(o["email"]);
    }
}

但在文档中(不确定这是官方的)。注册服务有一个步骤。我一直在搜索,几乎所有的文档都说“做这件事”,例如,没有任何理由;

代码语言:javascript
复制
If using ASP.NET Core, you will want to register a database connection in Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddTransient<MySqlConnection>(_ => new MySqlConnection(Configuration["ConnectionStrings:Default"]));
}

这是必须还是一种选择,我为什么要这样做?为什么没有这行代码我的代码还能正常工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-06 12:54:29

此模式用于ASP.NET核中的依赖注入。您的启动代码提供了一种方法(使用AddTransient)在需要时创建MySqlConnection。然后,您的控制器或模型可以通过在类构造函数中接收一个MySqlConnection来访问它。它被定义为Transient,以便每个需要一个MySqlConnection的对象都接收一个新的对象(并且多个对象不会共享相同的MySqlConnection)。

代码语言:javascript
复制
public class IndexModel : PageModel
{
    private readonly MySqlConnection _connection;

    public IndexModel(MySqlConnection connection)
    {
        _connection = connection;
    }

    public async Task OnGet()
    {
        await _connection.OpenAsync();
        // ...
    }
}

如果不使用依赖项注入,则不需要ConfigureServices方法。大多数文档“说‘这样做’没有任何理由”,因为它只是假设这是一个典型的ASP.NET核心6 web应用程序的创作方式。

票数 1
EN

Stack Overflow用户

发布于 2022-08-25 12:44:28

我想在布拉德利的回答中加入一点信息。DI的一个最大优点是,您可以指定一个作用域

  • 瞬变
  • 范围
  • 辛格尔顿

他已经包括了与正式文件的链接。请记住,这是一个ASP.NET核心应用程序。与普通的旧控制台应用程序相比,这些作用域定义了代码执行的时间,例如,每次有人访问您的网站,或者每次启动服务器时只执行一次。该框架处理新对象实例的创建,因此不需要自己调用new。在某些情况下,起初,这似乎是复杂和不必要的,但imho,当项目增长,模式是非常有用的。只需注入所需的服务,让框架处理在Program.cs中定义的作用域。

注意,在简化的.NET 6 Program.cs中,您只需调用:

代码语言:javascript
复制
var builder = WebApplication.CreateBuilder(args);
//...
builder.Services.AddScoped<YourService>();
//or interface
builder.Services.AddScoped<IYourService, YourService>();

Ofc --这取决于您要在多大程度上实现DI。但是我认为学习使用它是一个很好的实践,因为在某些情况下,它实际上有助于维护您的资源,比如套接字管理:参见HttpFactory。它使用DI的扩展方法。

imho的另一个主要优点是,当使用者注入接口时,您可以为DI指定一个接口,以及使用哪个类。使用该模式,您可以轻松地编写该接口的不同实现,您只需交换一个单个代码行就可以在任何地方更改inject类。

一个真实的例子是一个从本地json导入数据以进行调试和开发的服务,当API准备好之后,您将交换DI并使用一个调用REST的服务实现。另一种是将支付信息转发给paypal的服务,您希望将其替换为将其发送给信用卡公司的服务。

在您的示例中,可能自己调用new或使用瞬态就足够了。但是,请注意,外部资源(如SQL连接)是否可以立即处理,还是为特定的作用域保留。关于连接池的讨论并不新鲜,但是DI为您提供了一种解决这个问题的方法。

我发现这个DI上的教程也很有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72137562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档