2016-08-31 29 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

相关问题