4

我正在尝试将最近发布的 ASP.NET Identity 2.0.0 集成到一个 3 层 MVC 应用程序中。我不确定我是否朝着正确的方向前进。我可以看到两种方法。

在第一种方法中,我已经将身份集成到每个逻辑层中。有一些技术问题集成但仍在发展。

在第二种方法中,使用专用于安全的独立封装组件。

我目前采用了方法 1,但对这一切都提出了质疑。另外,还有其他方法可以采取吗?


方法一

Web
Startup.cs
/App_Start/Startup.Auth
/Controllers/Account
/Controllers/Manage
/Controllers/RolesAdmin
/Controllers/UserAdmin
/ViewModels
/Views

Business Logic
/Service/AccountService
/Service/ApplicationRoleManager
/Service/ApplicationUserManager
/Service/EmailService
/Service/SmsService
/Service/SignInHelper

Data
ApplicationDbContext
ApplicationUser

所以,我只是简单地将 Identity 插入到我认为合适的每一层中。我已将大部分日志放在业务逻辑层中,因为它不属于 Web,并且没有“真正的”数据库代码让它属于数据层。

附带问题:我有点不舒服,在 Web/App_Start/Startup.Auth 中,我必须实例化 Busness Logic 对象才能调用

app.CreatePerOwinContext(ApplicationDbContext.Create);

在数据层。我还没有考虑更多。这是另一个问题(但我发现它与我选择的架构有关)。


方法二

纯粹为不包含任何层的安全性创建一个程序集,即只需将 Identity 2.0.0 插入这个程序集。我的应用程序可以参考这个。但它违背了层次。但它封装了安全性。鉴于安全对象可以(或应该)在整个应用程序生命周期中驻留,这似乎不是一个坏主意。虽然没有考虑过可扩展性。

4

1 回答 1

3

我采用了方法 1,在创建上下文时,我有一个帮助程序类,我尝试从 HttpContext.Current.["DbActiveContext"] 获取上下文并在它存在时使用它,如果不创建则创建新的,并使用整个应用程序的单一上下文。因此,您最终不会为 aspnet 身份提供一个上下文,而为应用程序的其余部分提供另一个上下文。看起来您正在尝试在第一种方法中使用存储库模式,如果是这种情况,那么您的身份模型应该在 DB 层中,对于完整的存储库模式,您应该在创建时使用依赖注入对象,通过这样做,在运行时创建对象之前,您将不会有依赖关系。

namespace Data.Common
{
    public class ConnectionHelper : IConnectionHelper
    {
        private ApplicationDbContext _context;

        public ApplicationDbContext Context
        {
            get
            {
                 if (_context == null && HttpContext.Current.Items["DbActiveContext"] != null)
                {
                    _context = (ApplicationDbContext)HttpContext.Current.Items["DbActiveContext"];
                }
                else if (_context == null && HttpContext.Current.Items["DbActiveContext"] == null)
                {
                    _context = new ApplicationDbContext();
                    HttpContext.Current.Items.Add("DbActiveContext", _context);
                }
                return _context;
            }
            set { _context = value; }
        }
    }
}

此外,如果您想在服务层中使用用户管理器和 DI,您可以执行以下操作:

 public UserController()
         : this(
             new ApplicationUserManager(new UserStore<ApplicationUser>(new ConnectionHelper().Context)),
             new UserService())
    {

    }

使用 UserService 签名,例如:

public class UserService
{
    private readonly IRepository<ApplicationUser> _user;
    private readonly UserManager<ApplicationUser> _userManager;

    public UserService(IRepository<ApplicationUser> user,
        UserManager<ApplicationUser> userManager)
    {
        _user = user;
        _userManager = userManager;

    }

    public UserService()
        : this(
            new Repository<ApplicationUser>(new ConnectionHelper()),
            new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new   ConnectionHelper().Context)))
    {

    }

我希望这可以帮助你!

于 2014-05-23T17:42:02.040 回答