ApplicationDbContext-它在项目中所属的位置



我想在我的mvc 5应用程序中使用一个(EF)上下文文件,我想使用asp标识。

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

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

当你开始你的新项目时,你会如何处理ApplicationDbContext和asp标识?

你是把它留在UI层还是移到数据层?

我真的没有任何经验丰富的开发人员可以问,我希望它不会被否决。

我想你说的是实体框架的DbContext?如果是这样的话,那么您将其保留在DAL组件中是正确的。

移动它并更改你的命名空间就是你所需要做的。

分离标识:

将标识与UI分离要困难得多。在这里,微软已经将它们紧密地纠缠在一起,我建议您在了解专家级别的Identity、EF和Repository Pattern之前不要使用它。

但是,如果您有兴趣将Identity从UI级别中分离出来,这里有一个来自Dino Esposito的强大资源


  • 请注意您的账户管理员的构造函数中对ApplicationDbContext的引用

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

这很容易成为DAL中上下文的参考。

  • 在上下文中使用回购协议会遇到很大困难。这需要重写UserManager,我非常怀疑你是否想这样做。

  • 您可以创建从ApplicationDbContext继承并使用Interface 抽象的子级

public class UserIdentityContext : ApplicationDbContext, IUserIdentityContext 

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

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

但是这些操作都不允许您从UI项目中删除EF程序集。在这里,微软将数据和UI元素绑定得太紧密了。您必须重新编写帐户管理员。

这是他们正在处理的一个问题,在MVC 6Identity 3

中可能会有很大的改进

从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.aspx net.identity.entityframework包中定义的

相关内容

  • 没有找到相关文章

最新更新