身份要求我使用它来创建数据库上下文:
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
,它看起来就像我需要的东西......仍然不确定我是否会遇到任何问题?
答案 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
它有一个请求生命周期而不是线程或容器...我在使用分层时注意到奇怪的问题,而第二个看起来很有魅力!