Webapi中数据库的全局静态字典初始化

时间:2015-08-13 20:46:01

标签: c#-4.0 dictionary asp.net-web-api global-variables global-asax

我想在我的网络Api中从数据库初始化一个全局字典。我是否需要在Global.Asax或Owin Startup中注入我的DBContext。任何一个例子都会非常感激。

2 个答案:

答案 0 :(得分:4)

可以在自定义的OWIN Startup类类中进行任何类型的初始化,如下所示:

using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using Owin;
using System;

[assembly: OwinStartup(typeof(WebAPIRestWithNest.Startup))]

namespace YourNamespace
{
    public class Startup
    {
        public Dictionary<string, string> Table {get; private set;} 

        public void Configuration(IAppBuilder app)
        {
            // token generation
            app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
            {
                AllowInsecureHttp = false,

                TokenEndpointPath = new PathString("/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromHours(8),

                Provider = new SimpleAuthorizationServerProvider()
            });

            // token consumption
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

            app.UseWebApi(WebApiConfig.Register());

            Table = ... Connect from DB and fill your table logic ... 
        }
    }
}

之后,您可以使用应用程序中的Startup.Table属性。

答案 1 :(得分:2)

通常,在asp.net应用程序中使用静态字段访问对象是不好的做法,因为这可能会导致很难检测和重现的错误:尤其是对于非不可变/非线程安全的对象喜欢字典。

我假设你想在内存中缓存一些数据库数据,以避免过多的SQL查询。为此目的使用标准的asp.net缓存是个好主意:

public class MYContext : DbContext {
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Ignore<MenuItem_URL>();
    }

...

}

此方法允许您选择适当的到期策略(无需使用静态字典重新发明轮子)。

如果您仍想使用静态字典,可以在应用程序start(global.asax)上填充它:

public IDictionary GetDict() {
  var dict = HttpRuntime.Cache.Get("uniqueCacheKey") as IDictionary;
  if (pvtData==null) {
    dict = doLoadDictionaryFromDB(); // your code that loads data from DB
    HttpRuntime.Cache.Add(cacheKey, dict, 
       null, Cache.NoAbsoluteExpiration, 
       new TimeSpan(0,5,0), // cache at least for 5 minutes after last access
       CacheItemPriority.Normal, null);
  }
  return dict;
}