c# - 如何在注入前立即使用类?
问题描述
我在 sql 中有一些数据需要在 BuildWebHost 之前初始化。像这样
public static void PrepareToken(this IServiceCollection services)
{
services.AddSingleton<IValidationToken, ValidationToken>();
//need to use ValidationToken to init data immediately.
//services.Add... Other class
}
我可以写另一个类来做到这一点。但我想重用ValidationToken。我不能只新建 ValidationToken,因为 ValidationToken 构造函数是这样的:
private readonly ICacheManager _cacheManager;
private readonly IXXXXXRepository _XXXXXXXRepository;
private Dictionary<string, string> _validationToken = null;
private readonly object _lockObject = new object();
public ValidationToken(IXXXXXXXRepository XXXXXXXXRepository, ICacheManager cacheManager)
{
_XXXXXXXRepository = XXXXXXXXRepository;
_cacheManager = cacheManager;
}
任何人有任何模式或想法来解决这个问题?
解决方案
之后您无法立即执行此操作,services.Add~
因为当时尚不存在任何服务。服务集合仅收集服务注册。只是稍后服务集合被构建到服务提供者中,此时您可以解析这些服务。
如果您需要初始化 this ValidationToken
,那么您应该在其自己的构造函数中执行此操作。这样,您可以确保任何依赖于它的东西都将获得一个初始化的令牌。
或者,如果您需要验证令牌来初始化其他服务,那么您应该使这些服务正确地依赖于令牌,并让它们在各自的构造函数中初始化。
如果您需要在 Web 应用程序启动之前初始化某些内容,请在构建 Web 主机之后但在启动主机之前执行。所以你Program.Main
可能看起来像这样:
public static void Main(string[] args)
{
// create and build the host to make the DI container available
var host = CreateHostBuilder(args).Build();
// create a DI service scope in which the initialization can be done
using (var scope = host.Services.CreateScope())
{
// retrieve service and initialize whatever
var token = scope.ServiceProvider.GetService<ValidationToken>();
token.Initialize();
}
// start the host which spins up e.g. the ASP.NET Core web application
host.Run();
}
这使用 .NET Core 3.x 中的通用 HostBuilder。如果您仍在使用 WebHostBuilder,那么这看起来几乎相同;只需对返回的 WebHost 进行操作即可。
推荐阅读
- python - 有什么方法可以为二进制分类特征数据制作散点图?
- javascript - 多个画布上的动画贝塞尔曲线
- pyqt5 - 我想在 Travis-ci 上安装 pyqt5(Python 3.4),但它不起作用
- javascript - 如何用for中的ajax替换html(id)
- c++ - 渴望加载整个模型以估计 Tensorflow Serving 的内存消耗
- regex - 用于查找带有字符和数字的字符串的正则表达式
- excel - 文件夹中的 VB 脚本 RefreshAll(例外)
- python - 是否可以在 NetworKit 中创建属性图?
- python-3.x - 将 blob 数据插入 SQL 表的问题
- nativescript - 在 Nativescript 中使用 Android WorkManager