我想在我的mvc 5 app中使用一个(EF)上下文文件,我想使用asp身份。
我在解决方案DAL,GUI和WebAPI中有一些项目。
我想在DAL程序集中移动ApplicationDbContext
并从我的UI项目中删除EF completly。
当您开始新项目时,您使用ApplicationDbContext
和asp身份做了什么?
您是将其保留在UI图层中还是将其移至数据层?
我真的没有任何经验丰富的开发人员要求我希望它不会被投票。
答案 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包中定义