Asp .net Core использует экземпляр службы для вызова метода в другом методе, который запускается в Startup.cs - PullRequest
0 голосов
/ 08 июня 2018

У меня есть класс с методом, который является событием, и он получает данные, которые мне нужно сохранить в базе данных.

public class DataParser
{
SmsService smsService = new SmsService(..require context...);

 public void ReceiveSms()
 {
     //ParserLogic
     smsService.SaveMessage(...Values...);
 }
}

Поскольку служба сохраняет данные с помощью контекста, мне нужно передать их и инициализировать в конструкторе.После того, как я это сделаю, когда я создаю свой объект парсера для запуска при запуске, ему необходимо передать туда контекст.

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();
    }
}

Итак, как мне правильно сохранить данные в db?

1 Ответ

0 голосов
/ 08 июня 2018

вам нужно провести рефакторинг вашего кода.

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();
}

Или вы можете разрешить свой анализатор в контроллерах, службах, где угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...