ApplicationDbContext - 它在项目中的位置

时间:2014-09-13 22:34:28

标签: asp.net-mvc entity-framework asp.net-mvc-5 asp.net-identity projects-and-solutions

我想在我的mvc 5 app中使用一个(EF)上下文文件,我想使用asp身份。

我在解决方案DAL,GUI和WebAPI中有一些项目。

我想在DAL程序集中移动ApplicationDbContext并从我的UI项目中删除EF completly。

当您开始新项目时,您使用ApplicationDbContext和asp身份做了什么?

您是将其保留在UI图层中还是将其移至数据层?

我真的没有任何经验丰富的开发人员要求我希望它不会被投票。

3 个答案:

答案 0 :(得分:7)

我认为您正在谈论实体框架的DbContext?如果是这样,那么你是正确的将它保留在你的DAL组件中。

只需移动它并更改命名空间即可。

答案 1 :(得分:6)

分离身份:

从UI中分离标识要复杂得多。在这里,微软已经如此密切地纠缠它们,我建议将它留在它,直到你在专家级别理解身份,EF和存储库模式。

但是,如果您有兴趣将身份与UI级别分开,这里有一个很棒的 resource from Dino Esposito


  • 请注意您的帐户控制器构造函数中对ApplicationDbContext的引用:

    public AccountController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>
                             (new ApplicationDbContext())))
    

这很容易成为DAL中Context的引用。

  • 在上下文中使用Repo会很困难。这需要重新编写我非常怀疑你想做的UserManager

  • 您可以创建一个继承自ApplicationDbContext并使用接口抽象的子项

public class UserIdentityContext : ApplicationDbContext, IUserIdentityContext 

现在您可以使用Ninject将您的帐户控制器绑定到抽象模式

public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>
                         (IUserIdentityContext identityContext)))

但是这些动作都不允许您从UI项目中删除EF程序集。在这里,Microsoft过于紧密地绑定了Data和UI元素。您必须重新编写帐户控制器。

这是他们正在处理的问题,可能会在 MVC 6 / 身份3

答案 2 :(得分:1)

从您的ui项目中删除ApplicationDbContext是可能的,而不是那么困难。最完整的方法是创建一个webapi项目,它将公开IUserStore的功能,或者至少只是你需要的功能,你不需要它们。 web api方法只委托给DAL中使用的底层实体框架。喜欢(使用存储库)

  [HttpGet]
  [Route("finduserbyid/{userId}")]
  public async Task<IHttpActionResult> FindByIdAsync(string userId)
  {
     var verifiedUser = await this.UnitOfWork.ApplicationUserRepository.FindByIdAsync(userId);

     if (verifiedUser == null)
     {
        return NotFound();
     }

     return Ok(verifiedUser);
  }

然后在您的ui项目中创建一个新类,或者创建一个包含IUserStore的实用程序项目,并为webapi调用数据。我能在一天左右的时间内做到这一点,并不是很困难。像这样:

public class RemoteUserStore<T> : IUserStore<ApplicationUser>
    , IUserPasswordStore<ApplicationUser>
    , IUserLoginStore<ApplicationUser>
    , IUserRoleStore<ApplicationUser>
    , IUserEmailStore<ApplicationUser>
{
    public RemoteUserStore(string identityServerUrl)
    {
        _appServerUrl = identityServerUrl;
    }

    private readonly string _appServerUrl;
    private string IdentityServerUrl
    {
        get
        {
            return _appServerUrl;
        }
    }


    public async Task CreateAsync(ApplicationUser user)
    {
        var client = new HttpClient();
        string url = string.Format("{0}/api/identity/createuser/{1}", IdentityServerUrl, user.Id);

        var userContent = MapApplicationUserToFormContent(user);
        var result = await client.PostAsync(url, userContent);
    }

   //snip
}

然而,您将无法消除对实体框架的引用,因为UI实际上将使用带有IdentityUser的ApplicationUser作为基类,并且它在microsoft.aspnet.identity.entityframework包中定义