如何在简单注射器容器中注册一次性混凝土类型

How to register a disposable Concrete type in Simple Injector container

我在 Simple Injector Website

找到了以下代码
public static void RegisterDisposableTransient<TService, TImplementation>(
    this Container container)
    where TImplementation : class, IDisposable, TService
    where TService : class
{
    var scoped = Lifestyle.Scoped;
    var reg = Lifestyle.Transient.CreateRegistration<TService, TImplementation>(
        container);

    reg.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, 
            "suppressed.");

    container.AddRegistration(typeof(TService), reg);
    container.RegisterInitializer<TImplementation>(
        o => scoped.RegisterForDisposal(container, o));
}

我想注册一个具体实现(一个不实现任何特定接口的实现),它对于瞬态范围是一次性的。我需要对上面的代码做哪些修改

如果您想注册一个具体的一次性类型,通常最简单(也是最好)的做法是将其注册为 Scoped:

container.Register<MyConcrete>(Lifestyle.Scoped);

如果您确实需要该实例是瞬态的(不太可能),则必须执行以下操作。

这只是使用 CreateRegistration<TConcrete> 重载的问题:

public static void RegisterDisposableTransient<TConcrete>(this Container container)
    where TConcrete : class, IDisposable
{
    var scoped = Lifestyle.Scoped;
    var reg = Lifestyle.Transient.CreateRegistration<TConcrete>(container);

    reg.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, "suppres");

    container.AddRegistration(typeof(TConcrete), reg);
    container.RegisterInitializer<TConcrete>(
        o => scoped.RegisterForDisposal(container, o));
}