依赖注入 - 何时在Web应用程序中使用Singleton范围

时间:2016-09-27 19:43:04

标签: .net asp.net-web-api dependency-injection inversion-of-control simple-injector

在我的.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)吗?

1 个答案:

答案 0 :(得分:1)

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

在OP的情况下,它看起来好像所有类都是无状态的(从而线程安全),所以Singleton的生命周期对我来说很好。

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