使用 Reuse.InWebRequest/Reuse.InThread 时使用 DryIoc 解析新实例
Resolving new instances with DryIoc when using Reuse.InWebRequest/Reuse.InThread
我在 WebApi 项目中使用 DryIoc。默认重用设置为 Reuse.InWebRequest。在某些情况下,我需要在请求期间解析新实例。使用 Reuse.InCurrentScope 时,我可以像这样解析新实例:
public class Foo : IFoo
{
public Foo(IMyDependency dep, IContainer container){
using (var scope = container.OpenScope()) {
var newInstance = scope.Resolve<IMyDependency>();
Assert.IsFalse(ReferenceEquals(dep, newInstance));
}
}
}
但是当使用 Request.InWebRequest 或 Request.InThread(根据文档,它们基本相同)时,不会创建新实例,但会重用已解析的实例。我也尝试使用 IContainer.CreateFacade()
但结果是一样的。
我想知道是否有一种方法可以在不从头创建新容器的情况下强制创建新实例(无论指定的重用如何)。
更新说明
我不能使用 Reuse.Transient,因为我在请求期间 99% 的时间都需要同一个实例。只有在滥用容器作为服务定位器时我才需要一个新实例。
从 documentation 开始,Reuse.Transient
应该可以达到您的要求。
container.Register<IFoo, Foo>(Reuse.Transient);
您可以注册服务两次,一次使用作用域,一次使用瞬态重用。对于临时服务,在注册时指定一个serviceKey
,并在服务定位器中使用它来识别临时服务。
我在 WebApi 项目中使用 DryIoc。默认重用设置为 Reuse.InWebRequest。在某些情况下,我需要在请求期间解析新实例。使用 Reuse.InCurrentScope 时,我可以像这样解析新实例:
public class Foo : IFoo
{
public Foo(IMyDependency dep, IContainer container){
using (var scope = container.OpenScope()) {
var newInstance = scope.Resolve<IMyDependency>();
Assert.IsFalse(ReferenceEquals(dep, newInstance));
}
}
}
但是当使用 Request.InWebRequest 或 Request.InThread(根据文档,它们基本相同)时,不会创建新实例,但会重用已解析的实例。我也尝试使用 IContainer.CreateFacade()
但结果是一样的。
我想知道是否有一种方法可以在不从头创建新容器的情况下强制创建新实例(无论指定的重用如何)。
更新说明
我不能使用 Reuse.Transient,因为我在请求期间 99% 的时间都需要同一个实例。只有在滥用容器作为服务定位器时我才需要一个新实例。
从 documentation 开始,Reuse.Transient
应该可以达到您的要求。
container.Register<IFoo, Foo>(Reuse.Transient);
您可以注册服务两次,一次使用作用域,一次使用瞬态重用。对于临时服务,在注册时指定一个serviceKey
,并在服务定位器中使用它来识别临时服务。