首页 > 解决方案 > 有什么方法可以验证 DI 的寿命吗?

问题描述

我正在寻找某种方法来强制检查(当然是运行时)依赖注入服务的正确生命周期注册,在 .Net Core 或更高版本中。

假设我有一个像这样的有状态服务:

public class MyStatefulService
{
    private object _state;
}

但是,错误地,我可以用错误的生命周期注册它:

services.AddTransient<MyStatefulService>();

所以,我不会收到警报,但实际行为并不是我所期望的:服务是在每次请求时创建的,并且不会保留状态。

我想知道是否有办法加强这种模式。例如,如果我可以用这样的属性装饰类会很好:

[Singleton]
public class MyStatefulService
{
    private object _state;
}

此时,可能在启动时或第一次请求时,如果注册不同于AddSingleton(沿着其重载),框架应该抛出。

同样,该主题可以申请仅限临时服务,这些服务不应注册为单例。

我想到的唯一解决方案相当幼稚,我不太喜欢:

//line of principle code
public static class MySingletonChecker
{
    private static HashSet<Type> _set = new HashSet<Type>();

    public static void Validate(Type type)
    {
        if (_set.Contains(type))
        {
            throw new Exception();
        }
        else
        {
            _set.Add(type);
        }
    }
}


public class MyStatefulService
{
    public MyStatefulService()
    {
        MySingletonChecker.Validate(this.GetType());
    }

    private object _state;
}

有没有更好的解决方案、hack 或任何有助于防止错误的方法?

标签: c#asp.net-coredependency-injection.net-5

解决方案


如果你想对你的代码进行白痴验证,你可以提供一个扩展方法来IServiceCollection完全按照它应该的方式注册你的服务。

public static void AddMyStatefulService(this IServiceCollection services) 
{
    services.AddSingleton<MyStatefulService>();
}

然后在您的服务配置部分,开发人员将键入:

services.AddMyStatefulService();

推荐阅读