2014-11-06 24 views
1

我有OWIN /卡塔納自託管服務應用程序。 它的一個功能是通過WebAPI服務一些數據。 在這個應用程序中,我有一個名爲dataManager的類,它負責檢索數據,並將其傳遞到需要它的API控制器。 數據最終被提供給移動平臺,因此儘可能地緩存性能非常重要。 有沒有辦法在應用程序啓動時預加載我的DataManager,並讓它預先執行它的linq查詢?如何在OWIN自託管應用程序中預加載數據

的應用類看起來是這樣的:

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()幸福調用。然後,您只需在TaskManagerApplication.Stop()方法中添加對WebPipeline.Shutdown()的呼叫。

+0

謝謝!我一定會盡快給它試一試 – 2014-11-06 01:04:27

+0

它是否適合你?如果沒有,請告訴我。 – biscuit314 2014-11-07 01:39:41