c# - 有什么方法可以验证 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 或任何有助于防止错误的方法?
解决方案
如果你想对你的代码进行白痴验证,你可以提供一个扩展方法来IServiceCollection
完全按照它应该的方式注册你的服务。
public static void AddMyStatefulService(this IServiceCollection services)
{
services.AddSingleton<MyStatefulService>();
}
然后在您的服务配置部分,开发人员将键入:
services.AddMyStatefulService();
推荐阅读
- python - Python 错误出现在 Rust Cargo 中
- c# - 如何将字典 int 值添加到现有的 int 变量
- flutter - 为什么当我添加第二个侦听器时此广播流不起作用
- javascript - 如何创建 Firebase 云功能来重置用户密码
- dask - 镶木地板文件中的 Dask Dataframe:OSError:无法反序列化节俭:TProtocolException:无效数据
- javascript - 该程序无法识别 onkeyup 事件-asp.net
- javascript - iOS 14 API WKScriptMessageHandlerWithReply 如何与 iOS 中的 JavaScript 通信?
- python - Cython 拒绝融合 dtype 中的 float32
- multithreading - 如何在不同的线程中访问一个 Rc 值?
- python - 在python中调用表格的一行