如何在OWIN自托管应用程序中预加载数据

本文关键字:应用程序 加载 数据 OWIN | 更新日期: 2023-09-27 18:29:22

我有一个OWIN/Katana自托管服务应用程序。它的功能之一是通过WebAPI为一些数据提供服务。在这个应用程序中,我有一个名为dataManager的类,它负责检索数据,并将其传递给API控制器,后者请求数据。数据最终被提供给移动平台,因此为了提高性能,尽可能多地缓存数据是非常重要的。有没有一种方法可以在应用程序启动时预加载我的DataManager,并让它预执行它的linq查询?

Application类如下所示:

namespace TaskManager
{
  using System;
  using Microsoft.Owin.Hosting;
  public class TaskManagerApplication
  {
    protected IDisposable WebApplication;
    public void Start()
    {
      WebApplication = WebApp.Start<WebPipeline>("http://*:8080");
    }
    public void Stop()
    {
      WebApplication.Dispose();
    }
  }
}

Program类如下所示:

namespace TaskManager
{
  using Topshelf;
  internal class Program
  {
    private static int Main()
    {
      var exitCode = HostFactory.Run(host =>
      {
        host.Service<TaskManagerApplication>(service =>
        {
          service.ConstructUsing(() => new TaskManagerApplication());
          service.WhenStarted(a => a.Start());
          service.WhenStopped(a => a.Stop());
        });
        host.SetDescription("Task Manager");
        host.SetDisplayName("Task Manager");
        host.SetServiceName("TaskManager");
        host.RunAsNetworkService();
      });
      return (int) exitCode;
    }
  }
}

DataManager类中包含的数据检索语句如下所示:

var rawData = from data in new XPQuery<AccountView3.PipelineData>(uow)
                               where data.Stage.ToLower().Contains("won")
                                   && data.RevenueStartDate.Value.Year == DateTime.Today.Year
                                   && data.WeekOfTheYear >= priorWeekCutoff
                               select data;

如何在OWIN自托管应用程序中预加载数据

我所做的是在API库中创建一个公共静态类。这就是我修改HttpConfiguration对象的地方。这也是我定义OnStartup()OnShutdown()方法的地方。然后,我在管道类的方法(WebPipeline类)中调用这些方法。

例如(在我的控制器和东西所在的MyWebApi库中):

public class Service
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.EnsureInitialized();
    }
    public static void OnStartup()
    {
        // add any startup logic here, like caching your data
    }
    public static void OnShutdown()
    {
        // add any cleanup logic here
    }
}

然后在管道类中:

public class WebPipeline
{
    public static void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        MyWebApi.Service.Register(config);
        MyWebApi.Service.OnStartup();
        app.UseWebApi(config);
    }
    public static void Shutdown()
    {
        MyWebApi.Service.OnShutdown();
    }
}

现在您的TaskManagerApplication.Start()将导致调用API OnStartup()。然后您只需要在TaskManagerApplication.Stop()方法中添加一个对WebPipeline.Shutdown()的调用。