是否有替代方案我可以使用WebRequestLifestyle将实现相同的功能,但为Web和控制台应用程序?
是的。在简单的喷油器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();
这使得你的其余配置忘却给定的终端应用。
在您的控制台应用程序中,通常应使用LifetimeScopeLifestyle
。这意味着在你的控制台应用程序的容器将如下的创建如下:
var container = new Container();
// Use the SimpleInjector.Extensions.LifetimeScoping NuGet package for this
container.Options.DefaultScopedLifestyle = new LifetimeScopeLifestyle();
的LifetimeScopeLifestyle
是线程相关的生活方式,需要明确的管理。这意味着您将不得不在操作前后手动启动和处置使用期范围。如果您的控制台应用程序是短暂的,这通常意味着你在main方法做到这一点:
void Main()
{
var container = BuildContainer();
using (container.BeginLifetimeScope())
{
var service = container.GetInstance<MyRootType>();
service.DoSomething();
}
container.Dispose();
}
如果控制台应用程序是长(ER)的运行,它可能会处理多个自主请求(很像个人网络请求)。在这种情况下,你将不得不用一个生命周期范围来包装每个单独的请求(很像上面的例子)。
欲了解更多信息,see the documentation。
谢谢史蒂文;非常翔实的答案一如既往。 – Graham
@Steven,我看到'/Workspaces/appature/git/ImsHealth.Patterns/src/ImsHealth.Patterns.SimpleInjector/ConsoleApplicationContext.cs(18,60):警告CS0618:'LifetimeScopeLifestyle'已经过时:'这种生活方式是过时。请使用SimpleInjector.Lifestyles.ThreadScopedLifestyle来代替。''对此有何评论? – AndyCunningham
当我在PerThread生活方式下的SimpleInjector文档中看到这一点时,尤其令人困惑:“这种生活方式被故意排除在Simple Injector之外,因为它被认为是有害的。而不是使用Per Thread生活方式,你通常会更好地使用Scoped生活方式之一。# – AndyCunningham