1

我在 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% 的时间里我需要相同的实例。仅当将容器用作服务定位器时,我才需要一个新实例。

4

2 回答 2

2

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

于 2017-08-27T05:16:48.653 回答
1

文档中,Reuse.Transient应该可以实现您正在寻找的东西。

container.Register<IFoo, Foo>(Reuse.Transient);
于 2017-08-25T15:42:03.060 回答