如何在 Simple Injector 中创建 Tagged Litetimes?

How do I create Tagged Litetimes in Simple Injector?

我想要的是 Autofac 的 Simple Injector 等价物 tagged lifetimes

我已阅读 Simple Injector 的文档。最可能的方法是使用 Simple Injector 的 custom lifestyles:

但是关于它的文档非常少,我不知道如何从中得到我想要的东西。我怎样才能在 Simple Injector 中获得与 Autofac 标记作用域等效的东西?

我想要的示例:

// Arrange
var container = new Container();

container.Register<ICommand, ConcreteCommand>(new AsyncScopedLifestyle());
container.Register<IDBContext, ConcreteDbContext>(new AsyncScopedLifestyle("dbContext"));

using (AsyncScopedLifestyle.BeginScope(container))
{
    // Act
    var iCommandInstance1 = container.GetInstance<ICommand>();
    IDBContext iDbContextInstance1 = null;
    IDBContext iDbContextInstance2 = null;

    using (AsyncScopedLifestyle.BeginScope(container, "dbContext"))
    {
        var iCommandInstance2 = container.GetInstance<ICommand>();
        iDbContextInstance1 = container.GetInstance<IDBContext>();

        // Call things that depend on IDBContext here

        // Assert
        Assert.IsTrue(object.ReferenceEquals(iCommandInstance1, iCommandInstance2));
    }

    using (AsyncScopedLifestyle.BeginScope(container, "dbContext"))
    {
        var iCommandInstance3 = container.GetInstance<ICommand>();
        iDbContextInstance2 = container.GetInstance<IDBContext>();

        // Call things that depend on IDBContext here

        // Assert
        Assert.IsTrue(object.ReferenceEquals(iCommandInstance1, iCommandInstance3));
    }

    Assert.IsFalse(object.ReferenceEquals(iDbContextInstance1, iDbContextInstance2));
}

在我的例子中,让两个 IDBContext 实例相同是没有意义的。

简单注入器不支持此功能。如果您想使用自定义生活方式手动实现此功能,则必须重写 Simple Injector 的大部分内容。如果您确实需要此功能,请使用 AutoFac 或其他支持它的依赖注入框架。