【问题标题】:How to pre-load data in an OWIN self-hosted app如何在 OWIN 自托管应用程序中预加载数据
【发布时间】:2015-01-02 09:05:51
【问题描述】:

我有一个 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;

【问题讨论】:

    标签: c# linq katana self-hosting


    【解决方案1】:

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

    【讨论】:

    • 谢谢!我一定会尽快试一试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多