2014-11-06 7 views
1

OWIN/Katana 자체 호스팅 서비스 응용 프로그램이 있습니다. WebAPI를 통해 일부 데이터를 처리하는 기능 중 하나입니다. 이 응용 프로그램에서 데이터를 검색하고 그것을 요청한 API 컨트롤러에 전달하는 담당하는 dataManager라는 클래스가 있습니다. 데이터가 궁극적으로 모바일 플랫폼에 제공되므로 성능을 위해 가능한 한 많이 캐시하는 것이 매우 중요합니다. 응용 프로그램 시작시 내 DataManager를 미리로드하고 linq 쿼리를 미리 실행하는 방법이 있습니까?OWIN 자체 호스팅 응용 프로그램에서 데이터를 미리로드하는 방법

는 응용 프로그램 클래스는 다음과 같습니다

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; 

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

프로그램 클래스는 다음과 같습니다

답변

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() 존재가 발생합니다 라는. 그런 다음 전화 번호를 TaskManagerApplication.Stop() 방법에 추가하면됩니다.

+0

감사합니다. 나는 그것을 빨리 시험해 보게 확실 할 것이다 –

+0

그것은 너를 위해 잘 되었는가? 그렇지 않다면 알려주세요. – biscuit314