如何在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;
我所做的是在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()
的调用。