是否有替代方案我可以使用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