public class BaseApiController : ApiController
{
private AppDbContext _db = null;
protected AppDbContext db
{
get
{
if (_db == null)
{
_db = AppDbContext.Create(); //Hey look a proper factory that you can extend with other overloads! And I can debug this line - neat!
}
return _db;
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (_db != null)
_db.Dispose();
}
}
}
3 回答
CreatePerOwinContext注册一个静态回调,您的应用程序将使用该回调来获取指定类型的新实例 .
每个请求将调用一次此回调,并将对象/对象存储在 OwinContext 中,以便您可以在整个应用程序中使用它们 .
假设您已经定义了自己的IdentityDbContext实现:
和你的UserManager的实现:
在您的Owin Startup 中,您将注册回调:
这将调用静态方法:
和
现在,您将能够以一种简单直接的方式访问数据库上下文和用户管理器:
在 ApiController 中(如果您使用的是WebApi):
为了更直接地回答你的问题,这是没用的 .
这是某种人喜欢使用的IoC工厂 .
这个让你使用他们的(IoC)而不是你的选择 .
(我不喜欢IoC,对于那些想要感到温暖和模糊并且使用术语"architecture"的人来说,感觉就像一个反模式 . )
但是说真的,这个模式不是那个想法吗?为什么不自己使用Factory功能?现在你必须记住(谷歌)额外的API调用,当你在
Get
上按F12时,它将带你无处可用 .那你该怎么做呢?
就个人而言,我是粉丝使用OO,还记得OO吗? Pepperidge农场记得 . 使用OO,您可以保持控制,可以调试,记录,并且可以扩展 .
所有这些都可能是浪费时间,如果有人找到一些文档,为什么微软的工程师会把它放进去,他们可能有充分的理由,但我对此表示怀疑,所以让我们在此期间提出这个答案 .
UPDATE
这里有's the why, why it'在那里为微软:https://blogs.msdn.microsoft.com/webdev/2014/02/12/per-request-lifetime-management-for-usermanager-class-in-asp-net-identity/
基本上,UserManager和它们都是为这种结构而构建的 . 安全检查发生在管道中,那么为什么不将单例链接到请求,以减少浪费?因为它是隐藏的 .
我仍然建议在基类上创建自己的db上下文实例,它使得使用起来更加清晰 . 如果你真的想要,你可以在你的基类中有一个属性,它从OwinContext中检索单例 .
当我们想要做的就是:我们浪费多少时间来尝试制定这些花哨的API,授权属性等等:
显然,我更喜欢你能看到的详细代码 .
您可以使用
typeof
获取如下名称: