我试图将IdentityModels.cs移到另一个项目中,以使网站远离数据访问层。
我遵循了本教程:http://blog.rebuildall.net/2013/10/22/Moving_ASP_NET_Identity_model_into_another_assembly
并在此处检查了此问题:How to move MVC 5 IdentityModels.cs into a separate assembly
但我仍然感到困惑,因为 IdentityModels 引用另一个名为 ApplicationUserManager 的类,如下所示:
public class ApplicationUser : IdentityUser
{
public ClaimsIdentity GenerateUserIdentity(ApplicationUserManager manager)
{
//code removed for simplicity
}
}
当我去搜索该类的哪个位置时,我在位于以下类中的网站项目中找到它:App_Start / IdentityConfig.cs
//...More code in the upper section
public class SmsService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
// Plug in your SMS service here to send a text message.
return Task.FromResult(0);
}
}
// Configure the application user manager used in this application. UserManager is defined in ASP.NET Identity and is used by the application.
public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(IUserStore<ApplicationUser> store)
: base(store)
{
}
//More code bellow this...
现在,这让我来到这里,因为我真的迷失在新的ASP .NET身份框架中,而且我一直在努力处理那些看似不那么简单的非常简单的事情。
如何在不弄乱我的网站的情况下将IdentityModel移动到另一个项目?
其他一些数据:
答案 0 :(得分:17)
我在阅读了几篇看起来并不完全具备所需内容的帖子后,今天成功地做到了这一点。我希望这有助于其他人。
我的目标:将模型从现有的Web项目移动到另一个项目中。这包括域模型,业务逻辑和 ASP身份模型。
[编辑:不知何故,我错过了这个问题是针对Web表单的。我是在MVC中做到的。但是,我相信大部分内容仍然适用于我在VS2013网络表单项目中看到的内容。]
一步一步:
为名为xyz.Models的解决方案添加了新的类库(xyz是现有的web项目的命名空间) - 使用类似ModelLib的其他东西很好,你只需要稍后搜索/替换命名空间而前者你赢了“T
从Web项目中,将所有域模型移动到类库。我包括数据库上下文类(考试.XyzContext.cs),所有AspNet ...模型和IdentityModels.cs。 注意:暂时保留microsoft的默认 ManageViewModels.cs 。
接下来,我将ManageViewModels.cs移动到我的Web项目的ViewModels文件夹中,并将其命名空间从Models更改为ViewModels。 Views / Manage中的现有cshtml文件也需要反映此命名空间更改。
接下来, ManageController.cs 使用ManageViewModels.cs,所以我将'using xyz.ViewModels'添加到ManageController.cs。
接下来,在我的Web项目中有一个空的Models文件夹,我将其从项目中排除。
接下来,从Web项目的App_Start中,我将 IdentityConfig.cs 移动到模型类库,并将其名称空间更改为xyz.Models (也删除了它的'using xyz.Models'语句)
接下来,我添加了类库(xyz.Models)作为Web项目的引用。
接下来,我将以下NuGet包安装到类库
中以下内容可能不适用于您的项目,但这些是基于某些业务逻辑类在类库中需要的其他内容:
对“ System.Web.Mvc ”
对“ System.Web ”的引用 - 注意:有必要添加项目 引用System.Web,因为我使用的是 HttpContextBase , 类库中的 HttpContext (从一开始就令人困惑 我的班级已经有一个'using System.Web'语句。我不会哈希 为什么在这里,但只是确保你的项目中有'System.Web' 引用(仅System.Web.Mvc不会这样做。)
在此期间,根据我自己的偏好,我将IdentityModels.cs中的“DefaultConnection”更改为我用于其他人的数据库上下文(并删除了我的web项目的web.config中的引用,用于DefaultConnection ;保留“XyzContext”。)注意:所有表都在同一个db 。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("XyzContext", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
此时,编译在我创建的一个自定义类中为我提供了一个' GetOwinContext '错误,用于集中某些aspnet标识业务逻辑。要解决这个问题,我需要在我的类库中使用另一个NuGet包: Microsoft.Owin.Host.SystemWeb 。
之后一切正常。