加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

实体框架 – ASP.net身份,IoC和共享DbContext

发布时间:2020-12-16 09:53:46 所属栏目:asp.Net 来源:网络整理
导读:有没有人成功地使用OWIN ASP.NET Identity附加IoC来共享与WebApi(或MVC)应用程序相同的DbContext? 我想如果ASP.Net标识加载用户,它将加载到与应用程序其余部分相同的dbcontext中. (使用AutoFac作为IoC – 但不介意其他容器的示例) 编辑: 06 / Jan / 2014:
有没有人成功地使用OWIN ASP.NET Identity附加IoC来共享与WebApi(或MVC)应用程序相同的DbContext?

我想如果ASP.Net标识加载用户,它将加载到与应用程序其余部分相同的dbcontext中.

(使用AutoFac作为IoC – 但不介意其他容器的示例)

编辑:
06 / Jan / 2014:更具体一点,当ASP.Net标识尝试使用DbContext时,它需要与应用程序的其余部分相同的DbContext实例.否则,它将创建相同DbContext的两个实例.我已经在使用.PerHttpApiRequest()扩展名.

我发现的问题是,在设置OWIN类时,我无法找到一种方法:
1)将容器连接到OWIN管道;
2)告诉OWIN使用该容器解析它所需的类,以便它可以共享相同的范围(即OAUthServerOptions或任何其他可能包含其他依赖项的内容)

话虽如此,你如何设置解决上述两点的ASP.Net Identity?

解决方法

编辑:根据评论添加实例化OWIN管道.

由于ASP.NET Identity使用的IdentityDbContext继承自DbContext,您可以简单地创建自己的继承自IdentityDbContext的实现,如此

public class ApplicationContext : IdentityDbContext<ApplicationUser>
{
     //additional DbSets
    public DbSet<OtherEntity> OtherEntities { get; set; } 
}

public class ApplicationUser : IdentityUser
{
    //any custom properties you want for your user.
}

public class OtherEntity
{
    [Key]
    public int Id { get; set; }
}

现在就使用IoC而言,从统一的角度来看,我就像这样注册UserStore的一个实例

public static void RegisterTypes(IUnityContainer container)
{
    container.RegisterType<IUserStore<ApplicationUser>,UserStore<ApplicationUser>>(new InjectionConstructor(typeof(ApplicationContext)));
}

然后围绕用户管理器创建一个包装器

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store)
    {
    }
}

并在我需要用户经理的任何地方注入.

对于OWIN管道,您需要通过容器实例化OAuthAuthorizationProvider,就像这样.

container.RegisterType<IOAuthAuthorizationServerProvider,ApplicationOAuthProvider>(new InjectionConstructor("self",typeof(ApplicationUserManager)));

然后,例如在WebApi中,您只需要在启动时从容器中获取实例.

static Startup()
        {
            OAuthOptions = new OAuthAuthorizationServerOptions
            {
                TokenEndpointPath = new PathString("/Token"),Provider = (IOAuthAuthorizationServerProvider)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IOAuthAuthorizationServerProvider)),AccessTokenExpireTimeSpan = TimeSpan.FromDays(5),AllowInsecureHttp = true,RefreshTokenProvider = new SimpleRefreshTokenProvider()
            };
        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读