代码之家  ›  专栏  ›  技术社区  ›  Daniel Žeimo

net内核使用服务实例调用在startup.cs中运行的另一个方法中的方法

  •  2
  • Daniel Žeimo  · 技术社区  · 7 年前

    我有一个类,它的方法是event,它获取需要存储到数据库中的数据。

    public class DataParser
    {
    SmsService smsService = new SmsService(..require context...);
    
     public void ReceiveSms()
     {
         //ParserLogic
         smsService.SaveMessage(...Values...);
     }
    }
    

    当服务在上下文的帮助下保存数据时,我需要在构造函数中传递和初始化它。之后,当我创建要在启动时运行的解析器对象时,ir需要在那里传递上下文。

    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 回复  |  直到 7 年前
        1
  •  3
  •   tym32167    7 年前

    你需要重构你的代码。

    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

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

    或者您可以在控制器、服务中解析您的解析器。

    推荐文章