gpt4 book ai didi

.net - 依赖注入(inject) - 何时在 Web 应用程序中使用单例范围

转载 作者:行者123 更新时间:2023-12-04 00:24:34 24 4
gpt4 key购买 nike

在我的 .NET Web APIv2 项目中,我发现自己将所有注入(inject)服务的范围标记为 Singleton .

我正在使用 Simple Injector DI 框架(这对我的具体问题并不重要)。

这是一个简化的示例:

public class SqlConnectionFactory : IDbConnectionFactory
{
public async Task<SqlConnection> GetOpenSqlConnectionAsync()
{
var connection = new SqlConnection("connstring");

await connection.OpenAsync();

return connection;
}
}


public class UserService : IUserService
{
private IDbConnectionFactory DbConnectionFactory { get; set; }

public UserService(IDbConnectionFactory dbConnectionFactory)
{
DbConnectionFactory = dbConnectionFactory;
}

public async Task AddAsync(AddUserDto data)
{
using (SqlConnection connection = await DbConnectionFactory.GetOpenSqlConnectionAsync())
{
// Create a glorious SqlCommand...
await cmd.ExecuteNonQueryAsync();
}
}
}

我的一些其他服务包括一些密码学类,它们不包含任何状态,并且很容易成为静态类。

这是简单的注入(inject)代码,只是为了完成:
        var container = new Container();

container.Register<IDbConnectionFactory, SqlConnectionFactory>(Lifestyle.Singleton);
container.Register<IUserService, UserService>(Lifestyle.Singleton);

根据我创建数据库连接的方式,在我看来单例对我的 SqlConnectionFactory 来说是合适的。类,还有我的 UserService上课,但如果我错了,请纠正我。

这让我问,你什么时候(或者你不会)使用单例范围来注入(inject)服务?如果你可以使用单例,你为什么不呢?不必为每个 Web 请求线程或方法的条目( transient )实例化一个新实例,这是否没有性能优势?

最佳答案

作为一般规则,对线程安全类使用 Singleton 生命周期。如果单个实例也可以完成这项工作,那么就没有理由一直创建新实例。但是,您也需要避免Captive Dependencies .

在 OP 的情况下,在我看来好像所有类都是无状态的(因此是线程安全的),所以单例生命周期对我来说看起来不错。

使用 DI 容器时可能很难发现终生不匹配,但会变得很多 easier to detect when using Pure DI .这是我喜欢 Pure DI 的众多原因之一.

关于.net - 依赖注入(inject) - 何时在 Web 应用程序中使用单例范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39733051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com