我想在我的网络Api中从数据库初始化一个全局字典。我是否需要在Global.Asax或Owin Startup中注入我的DBContext。任何一个例子都会非常感激。
答案 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;
}