gpt4 book ai didi

c# - 控制台应用程序使用哪种生活方式?

转载 作者:太空狗 更新时间:2023-10-30 00:49:16 24 4
gpt4 key购买 nike

我有一个工作单元类,它在一个由各种 Web 应用程序共享的通用程序集中使用 Simple Injector 注册。

注册为:

Container.Register(typeof(IUnitOfWork), typeof(UnitOfWork), new WebRequestLifestyle()); 

我现在有一个控制台应用程序需要使用程序集中定义的容器,但显然不能使用WebRequestLifestyle。如果我尝试,我会收到以下错误:

The IUnitOfWork is registered as 'Web Request' lifestyle, but the instance is requested outside the context of a Web Request.

我可以使用 WebRequestLifestyle 的替代方案来实现相同的功能,但同时适用于 Web 和控制台应用程序吗?

最佳答案

Is there an alternative I can use to WebRequestLifestyle that will achieve the same functionality but for both web and console applications?

是的。在 Simple Injector v3 中,建议的模式是始终使用 Lifestyle.Scoped:

Container.Register(typeof(IUnitOfWork), typeof(UnitOfWork), Lifestyle.Scoped);

Lifestyle.Scoped 是一种“占位符生活方式”,映射到通过 Container.Options.DefaultScopedLifestyle 配置的作用域生活方式。

这意味着在您的 Web 应用程序中,您必须使用以下方法创建一个新的 Container 实例:

var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();

这会使您的其余配置忽略给定的最终应用程序。

在您的控制台应用程序中,您通常应该使用 AsyncScopedLifestyle。这意味着您的容器创建在您的控制台应用程序中将如下所示:

var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

AsyncScopedLifestyle 可用于单线程和异步操作。它需要明确的管理。这意味着您必须在操作前后手动启动和处理范围。如果您的控制台应用程序是短暂的,这通常意味着您在 main 方法中执行此操作:

void Main() 
{
var container = BuildContainer();

using (AsyncScopedLifestyle.BeginScope(container))
{
var service = container.GetInstance<MyRootType>();

service.DoSomething();
}

container.Dispose();
}

如果控制台应用程序长时间(呃)运行,它可能会处理多个自主请求(很像单独的网络请求)。在这种情况下,您将不得不用范围包装每个单独的请求(很像上面的示例)。

欲了解更多信息,see the documentation .


编辑:如果您仍在控制台应用程序中使用 v3,则需要使用 SimpleInjector.Extensions.LifetimeScoping 中的 LifetimeScopeLifestyle .

var container = new Container();
container.Options.DefaultScopedLifestyle = new LifetimeScopeLifestyle();

要使用它,请替换示例中的 using:

using (container.BeginLifetimeScope())
{
//...
}

关于c# - 控制台应用程序使用哪种生活方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39248736/

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