c# - Asp .net Core 使用服务实例调用在 Startup.cs 中运行的另一个方法中的方法
问题描述
我有一个带有事件方法的类,它获取我需要存储到数据库的数据。
public class DataParser
{
SmsService smsService = new SmsService(..require context...);
public void ReceiveSms()
{
//ParserLogic
smsService.SaveMessage(...Values...);
}
}
由于服务在上下文的帮助下保存数据,我需要传递它并在构造函数中初始化。在我这样做之后,当我创建要在 Startup 上运行的解析器对象时,需要在那里传递上下文。
public class Startup
{
DataParser data = new DataParser(...requires db context...)
public void ConfigureServices(IServiceCollection services)
{
//Opens port for runtime
InnerComPortSettings.OpenPort();
//Runtime sms receiver
data.ReceiveSms();
}
}
那么我怎样才能正确地将数据保存到数据库中呢?
解决方案
你需要重构你的代码。
1)您不必在解析器中创建服务。将其作为依赖项传递
public class DataParser
{
public DataParser(SmsService smsService)
{
SmsService _smsService = smsService;
}
public void ReceiveSms( )
{
//ParserLogic
smsService.SaveMessage(...Values...);
}
}
2)现在您需要注册您的上下文以及解析器和服务
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDbContext>(options =>... your options here); // register your context
services.AddSingleton<SmsService, SmsService>(); // register your sms servcice which is required data context
services.AddSingleton<DataParser, DataParser>(); // register your parser
}
5) 现在是时候重构你的短信服务了
public class SmsService
{
private readonly IServiceScopeFactory _scopeFactory;
public SmsService(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
public async Task SaveMessage(....)
{
using (var scope = _scopeFactory.CreateScope())
{
using (var ctx = scope.ServiceProvider.GetService<MyDbContext>())
{
... make changes
await ctx.SaveChangesAsync();
}
}
}
}
Startup
4)当一切都注册后,你可以在类的configure方法中解决你需要的东西
public void Configure(IApplicationBuilder app, DataParser data) // resolving your data perser and using it
{
//Opens port for runtime
InnerComPortSettings.OpenPort();
//Runtime sms receiver
data.ReceiveSms();
}
或者,您可以随时随地在控制器、服务中解析解析器。
推荐阅读
- linux - 在运行在 aws linux 实例上的 jenkins 上运行 Katalon Studio 测试套件
- visual-studio - Visual Studio Community 2017 中的构建错误
- azure - 并行执行多个 Pyspark 脚本
- javascript - 无法让 startDate 或 endDate 在我的引导 datetimepicker 中工作?
- sql - 选择 current_user 的组名
- hadoop - 如何停止 Hadoop cat:在 shell 中运行循环时无法自动写入输出流?
- macos - 从命令行杀死 vscode
- c# - 发布到 ARM 上的 Linux 后找不到静态文件
- akka - Akka http 流式传输响应标头
- c# - 如何使用表单身份验证获取 Windows 用户凭据?