我在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%的时间内在请求期间需要相同的实例。我只在将容器滥用为服务定位器时才需要新实例。
答案 0 :(得分:2)
您可以注册服务两次,一次使用作用域,另一次使用瞬态重用。对于瞬态,在注册时指定serviceKey
,并在服务定位器中使用它来识别瞬态服务。
答案 1 :(得分:1)
从documentation开始,Reuse.Transient
应该可以实现您的目标。
container.Register<IFoo, Foo>(Reuse.Transient);