2014-11-06 3 views
1

У меня есть служебное приложение OWIN/Katana. Одна из его функций - обслуживать некоторые данные через WebAPI. В этом приложении у меня есть класс, называемый dataManager, который отвечает за получение данных и передает его на контроллер API, который просил об этом. Данные в конечном счете передаются на мобильную платформу, поэтому очень важно максимально кэшировать производительность. Есть ли способ предварительно загрузить мой DataManager при запуске приложения и предварительно выполнить его linq-запросы?Как предварительно загрузить данные в самообслуживаемое приложение OWIN

Класс 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(); 
    } 
    } 
} 

Программа выглядит следующим образом:

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; 

ответ

0

Я создаю публичный статический класс в библиотеке 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() существа называется. Затем вам нужно добавить звонок в WebPipeline.Shutdown() в свой метод TaskManagerApplication.Stop().

+0

Спасибо! Я обязательно отвечу на него –

+0

Разве это сработало для вас? Если нет, дайте мне знать. – biscuit314

Смежные вопросы