使用Reuse.InWebRequest / Reuse.InThread时,使用DryIoc解析新实例

时间:2017-08-25 15:35:58

标签: c# dependency-injection ioc-container dryioc

我在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%的时间内在请求期间需要相同的实例。我只在将容器滥用为服务定位器时才需要新实例。

2 个答案:

答案 0 :(得分:2)

您可以注册服务两次,一次使用作用域,另一次使用瞬态重用。对于瞬态,在注册时指定serviceKey,并在服务定位器中使用它来识别瞬态服务。

答案 1 :(得分:1)

documentation开始,Reuse.Transient应该可以实现您的目标。

container.Register<IFoo, Foo>(Reuse.Transient);