app.CreatePerOwinContext并共享数据库上下文

时间:2015-05-28 14:59:17

标签: c# unity-container identity

身份要求我使用它来创建数据库上下文:

app.CreatePerOwinContext(EFDbContext.Create);

所以我需要让Microsoft Unity IOC正确无误。

我遇到的问题是我意外地制作了2个数据库上下文。一个用于我的应用程序中的其他所有内容,另一个用于用户内容我开始在错误的上下文中为用户编写函数,并使其抛出错误。

所以我决定为我的EFDbContext使用终身经理:

// Database context

container.RegisterType<EFDbContext>(new PerThreadLifetimeManager());

// Microsoft identity stuff

container.RegisterType<ApplicationSignInManager>();
container.RegisterType<ApplicationUserManager>();
container.RegisterType<IAuthenticationManager>(
    new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication));
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
    new InjectionConstructor(typeof(EFDbContext)));

我想知道这是否会在将来引起问题?

修改

我发现Identity中的异步内容可能导致此设置出现问题...

我现在使用HierarchicalLifetimeManager,它看起来就像我需要的东西......仍然不确定我是否会遇到任何问题?

2 个答案:

答案 0 :(得分:1)

你应该没问题 - 当你做一个Resolve或ResolveAll从容器中取回对象时,当你使用PerThreadLifeTimeManager设置时,Unity将为该线程返回相同的实例。所以除非你在做多线程应用程序,否则你应该没问题。

参考:https://msdn.microsoft.com/en-us/library/ff660872(v=pandp.20).aspx

答案 1 :(得分:1)

我发现这篇文章似乎完全符合要求:

http://www.wiktorzychla.com/2013/03/unity-and-http-per-request-lifetime.html

它有一个请求生命周期而不是线程或容器...我在使用分层时注意到奇怪的问题,而第二个看起来很有魅力!