具有相关瞬态的ASP.NET Core DI

时间:2019-02-22 12:28:21

标签: c# asp.net-web-api asp.net-core dependency-injection

我有2个服务:用于数据库操作的IDbStorage和IExceptionManager异常管理。 ExceptionManager类本身依赖于IDbStorage的实例:

    public class ExceptionManager : IExceptionManager
    {
        private IDbStorage _CurrentDbStorage;

        public IDbStorage CurrentDbStorage
        {
            get { return _CurrentDbStorage; }
        }

        public ExceptionManager(IDbStorage currentDbStorage)
        {
            _CurrentDbStorage = currentDbStorage;
        }
}

在启动中,我声明:

services.AddTransient<IDbStorage, OracleDbStorage>();
services.AddTransient<IExceptionManager, ExceptionManager>();

在所有控制器中,我都使用了这两种服务。 F.e:

public abstract class BusinessObjectManagementController<T1> : ControllerBase where T1 : BusinessObject
    {

        private IDbStorage _CurrentDbStorage;

        public IDbStorage CurrentDbStorage
        {
            get { return _CurrentDbStorage; }
        }

        private IExceptionManager _CurrentExceptionMgr;

        public IExceptionManager CurrentExceptionMgr
        {
            get { return _CurrentExceptionMgr; }
        }

        public BusinessObjectManagementController(IDbStorage currentDbStorage, IExceptionManager currentExceptionMgr)
        {
            _CurrentDbStorage = currentDbStorage;
            _CurrentExceptionMgr = currentExceptionMgr;
        }

}

一切正常,但是我不确定是否将IDbStorage的同一实例注入CurrentExceptionMgr或创建新实例?

谢谢。

1 个答案:

答案 0 :(得分:1)

对于.NET Core DI,存在三种不同的服务寿命。您已将IDbStorage声明为临时的,因此每次请求服务时都会创建OracleDbStorage的新实例。这是.NET Core文档中的相关内容:

  

每次请求时都会创建瞬态生命周期服务。此生命期最适合轻量级,无状态服务。

     

范围内的生命周期服务每个请求创建一次。

     

单生命周期服务是在首次请求它们时创建的(或者在运行ConfigureServices并使用服务注册指定实例时创建)。每个后续请求都使用相同的实例。