gpt4 book ai didi

c# - 如何确定在 Simple Injector 中使用哪种生活方式

转载 作者:行者123 更新时间:2023-12-05 09:16:55 24 4
gpt4 key购买 nike

我的应用程序使用 Entity Framework 。因为我希望我的 DbContext 在单个请求中重复使用,所以我将其注册为 Lifestyle.Scoped,如下所示:

container.Register<MyDbContext>(Lifestyle.Scoped);

其他类得到这个 MyDbContext 注入(inject)。例如,请参阅以下存储库:

ApplicationsRepository 是:

public class ApplicationsRepository : IApplicationsRepository
{
private readonly MyDbContext _dbContext;

public ApplicationsRepository(MyDbContext dbContext)
{
_dbContext = dbContext;
}

public void Save()
{
_dbContext.Save();
}

public Application GetByName(string appName)
{
var dbApplication = _dbContext.APPLICATIONS.FirstOrDefault(a => a.NAME == appName);

return ApplicationMapper.MapApplicationFromAPPLICATIONS(dbApplication);
}
}

但是还有无数其他类依赖于 MyDbContext。其他类可能不直接依赖于 MyDbContext,但会注入(inject)依赖于 MyDbContext 的类。

我的问题是:我应该为这些类(class)使用什么样的生活方式管理以及如何实现它?

最佳答案

有 3 种基本生活方式可供选择,Transient、Scoped 和 Singleton,您已经通过阅读了解了 this .

为特定组件选择哪种生活方式取决于几个因素:

  • 组件是否可以跨请求/线程安全地使用
  • 组件是否包含需要跨线程共享的状态
  • 组件依赖项的生活方式。

首先,您的组件需要的生活方式是您需要根据该组件的设计方式做出的选择。有些组件根本无法重用,应始终在请求时重新创建。这通常适用于 MVC Controller 等框架类型。虽然每个请求通常有一个 Controller ,但也可以请求其他 Controller ,这需要创建新实例。这相当于 Transient 生活方式。

您注册的其他组件或类需要重用。 Entity Framework 的 DbContext 等工作单元实现通常需要在整个请求期间重复使用。您可以阅读有关为什么要重用 DbContext 的详细讨论 here .这相当于 Scoped 生活方式。

其他组件是完全无状态或不可变的,并且可以由应用程序中的所有线程并行重用而不会出现任何问题。其他组件可能是有状态的或可变的,但在设计时考虑了线程安全。他们可能会实现需要更新的应用程序范围的缓存,并且对组件的访问受到锁的保护。这意味着您在整个应用程序中只能重用一个实例。这相当于单例生活方式。

然而,依赖关系使组件的生活方式选择变得复杂,因为组件的生命周期绝不能长于它的任何依赖关系。不遵守此规则会导致 Captive Dependencies , 或 Lifestyle Mismatches正如 Simple Injector 所说的那样。

这意味着即使您确定一个组件有资格成为单例,它也只能与其最短的依赖项一样长。换句话说,如果组件具有 Scoped Dependency,它本身只能是 Scoped 或 Transient。简易喷油器 will detect如果您配置错误。

但这确实意味着您为组件所做的选择会向上传播调用堆栈给组件的使用者。

一般来说,这会产生一个结构,其中应用程序对象图中的叶组件是 Scoped 和 Singleton,而根类型是 Transients。如果您以这种方式构建对象图,那么您就是在遵循 Closure Composition Model .

还有一个选择DI Composition Model , 它被称为 Ambient Composition Model .在练习此模型时,在大多数情况下,您会将状态保留在组件之外,而是将状态存储在由 Composition Root 控制的环境状态中。 .两种组合模型都有自己的 advantages and disadvantages .

关于c# - 如何确定在 Simple Injector 中使用哪种生活方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49388940/

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