2 回答
TA贡献1783条经验 获得超4个赞
.NET Core DI 范围生命周期设置如何工作?它的生命周期是什么?
.Net 核心在内部与称为ServiceScope. 当调用新请求(例如 Web 请求)时,会创建新实例,其中包含新的服务提供者。在请求期间,此服务提供者用于依赖项解析。请求完成后,范围将被处理,并且其服务提供者及其已解析的服务。
internal class ServiceScope : IServiceScope, IDisposable
{
private readonly Microsoft.Extensions.DependencyInjection.ServiceProvider _scopedProvider;
public ServiceScope(Microsoft.Extensions.DependencyInjection.ServiceProvider scopedProvider)
{
this._scopedProvider = scopedProvider;
}
public IServiceProvider ServiceProvider
{
get
{
return (IServiceProvider) this._scopedProvider;
}
}
public void Dispose()
{
this._scopedProvider.Dispose();
}
}
是否有可能在 Ninject DI 中实现类似的行为?
正如您已经注意到的那样,实现自定义范围是可行的。
编辑:
.NET Core DI 的原理与任何其他 IOC 容器相同。它通过 DI 为您的对象(MVC 控制器等)提供依赖项并控制其生命周期。
如果您为 DbContext 指定单例生命周期,则仅创建一个,由 DI 在请求时提供,并在整个应用程序/容器生命周期内保留在内存中。
如果您指定瞬态,则在请求 DbContext 的所有时间都会获得新的。
如果指定范围,则 DbContext 的生命周期将绑定到某个一次性范围,该范围是在某些逻辑请求(asp 中的 http 请求)开始时创建的。当 DI 第一次请求 DbContext 时,会创建新的,保存在内存中,并且在后续 DI 请求中始终保持不变,直到范围被释放(在 asp 的情况下为 http 请求结束)和 DbContext 与它。
您可以找到与 TransactionScope 类似的并行。此处,同一个 TransactionScope 中的所有 sqlCommand 都被登记到同一个 sql 事务工具中,该范围已被释放/提交。
- 2 回答
- 0 关注
- 231 浏览
添加回答
举报