在我的.NET Web APIv2项目中,我发现自己将所有注入的服务的范围标记为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();
}
}
}
我的一些其他服务包括一些加密类,它们不包含任何状态,并且很容易成为静态类。
这里是Simple Inject代码,仅用于完成:
var container = new Container();
container.Register<IDbConnectionFactory, SqlConnectionFactory>(Lifestyle.Singleton);
container.Register<IUserService, UserService>(Lifestyle.Singleton);
根据我创建数据库连接的方式,我觉得Singleton适用于我的SqlConnectionFactory
课程,以及我的UserService
课程,但请更正我如果我错了。
这让我想问一下,您(或不愿意)何时使用Singleton范围进行注入服务?如果你能使用单身人士,为什么不能呢?不是必须为每个Web请求线程实例化一个新实例,或者为方法输入(Transient)吗?
答案 0 :(得分:1)
作为一般规则,对线程安全类使用Singleton生存期。如果单个实例也能完成这项工作,那么没有理由一直创建新实例。但是,您也需要避免使用Captive Dependencies。
在OP的情况下,它看起来好像所有类都是无状态的(从而线程安全),所以Singleton的生命周期对我来说很好。
使用DI容器时很难发现生命周期不匹配,但变得多easier to detect when using Pure DI。这是我喜欢Pure DI的众多原因之一。