вам нужно провести рефакторинг вашего кода.
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();
}
}
}
}
4) Когда все зарегистрировано, вы можете разрешить то, что вам нужно, в методе настройки Startup
class
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();
}
Или вы можете разрешить свой анализатор в контроллерах, службах, где угодно.