2016-08-31 31 views
2

我有一個單位的工作類,這是註冊與簡單的注射器在一個共同的組裝,由各種網絡應用程序共享。哪種生活方式可用於控制檯應用程序?

已被註冊爲:

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

我現在需要使用在裝配中定義的容器中的控制檯應用程序,但顯然不能用WebRequestLifestyle。我收到以下錯誤,如果我嘗試:

IUnitOfWork被註冊爲「網絡請求的生活方式,但實例被請求的Web請求的範圍之外。

是否有替代方案我可以使用WebRequestLifestyle將實現相同的功能,但網絡和控制檯應用程序?

回答

4

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

+0

謝謝史蒂文;非常翔實的答案一如既往。 – Graham

+0

@Steven,我看到'/Workspaces/appature/git/ImsHealth.Patterns/src/ImsHealth.Patterns.SimpleInjector/ConsoleApplicationContext.cs(18,60):警告CS0618:'LifetimeScopeLifestyle'已經過時:'這種生活方式是過時。請使用SimpleInjector.Lifestyles.ThreadScopedLifestyle來代替。''對此有何評論? – AndyCunningham

+0

當我在PerThread生活方式下的SimpleInjector文檔中看到這一點時,尤其令人困惑:「這種生活方式被故意排除在Simple Injector之外,因爲它被認爲是有害的。而不是使用Per Thread生活方式,你通常會更好地使用Scoped生活方式之一。# – AndyCunningham

相關問題