我想在我的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包中定义的