【问题标题】:MVC4, UnitOfWork + DI, and SimpleAuthentication .. how to decouple?MVC4、UnitOfWork + DI和SimpleAuthentication..如何解耦?
【发布时间】:2013-03-16 03:13:37
【问题描述】:

我目前正在开发一个 MVC4 项目,我使用 if Ninject 将 UnitOfWork 注入到我的控制器中,并且我正在使用 UnitOfWork + Generic Repository 模式。

我不喜欢 VS2012 MVC4 模板,因为它直接使用数据库访问(例如数据库初始化)。

我的项目分为:

  • 一个 UI 项目(mvc4 应用程序),带有表单身份验证

  • 一个域项目(数据库实体、存储库、UnitOfWork 接口以及两个 UnifOfWork 实现,一个带有 MOQ,一个带有 EF;它们通过 Ninject 注入 UI 控制器)。

我看了这个例子:

http://kevin-junghans.blogspot.it/2013/03/decoupling-simplemembership-from-your.html

与这个问题有关

SimpleMembership - anyone made it n-tier friendly?

现在我有一个问题:

  • 如何在此处注入我的 UoW? WebSecurity 类是静态的,没有构造函数,它直接实例化 UoW 以在 db 上执行活动 ...

  • 我总是必须初始化 WebMatrix 才能直接访问 DB?这段代码:

        public static void Register()
    {
        Database.SetInitializer<SecurityContext>(new InitSecurityDb());
        SecurityContext context = new SecurityContext();
        context.Database.Initialize(true);
        if (!WebMatrix.WebData.WebSecurity.Initialized)
            WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("DefaultConnection",
                "UserProfile", "UserId", "UserName", autoCreateTables: true);
    }
    

打破了我与域的解耦。例如,我如何使用我的 UnitOfWork 来制作 WebSecurity?最佳做法是什么?

  • 如何存储其他数据(例如,EmailAddress 等)并检索它,而无需在每次必须访问用户配置文件时执行数据库查询?类似于旧的 CustomPrincipal ... Custom principal in ASP.NET MVC

谢谢!

【问题讨论】:

    标签: authentication asp.net-mvc-4 dependency-injection unit-of-work simplemembership


    【解决方案1】:

    Marco 有很多问题。让我来攻击他们。

    如何注入 UOW

    静态类和依赖注入不能很好地混合,如pointed out in this QA。正如您引用的文章中所讨论的那样,当我第一次进行 SimpleMembership 解耦练习时,我的注意力只是与域解耦。这只是第一步,还可以改进,包括使依赖注入更容易。我争论过是否将 WebSecurity 设为静态并选择了静态,因为这就是原始 SimpleMembership 的实现方式,使其成为SimpleSecurity 用户的更无缝过渡。 SimpleSecurity 是一个开源项目,欢迎贡献。使它成为非静态的并不困难,从长远来看可能是有意义的。一旦它变成非静态的,我们就可以使用工厂模式来创建 UnitOfWork 并注入适当的工厂。

    为什么我必须注册 WebSecurity?

    SimpleSecurity 只是对需要初始化的 WebMatrix WebSecurity 类的封装。 Register 方法只是确保 WebMatrix 已初始化并初始化我们的数据库。我不同意在 Globa.asax 中调用此方法会以任何方式将其与域耦合。让它与您的 UnitOfWork 一起工作应该与应用程序域无关,或者与在应用程序启动时必须调用注册方法无关。

    如何在不每次都执行数据库查询的情况下存储和检索其他数据(例如:电子邮件)?

    这实际上在 .NET 4.5 中使用ClaimsPrincipal 很容易完成。 .NET 4.5 中的所有主体都继承自 ClaimsPrincipal,这允许您将信息作为声明存储在主体中。声明基本上是键值对,可让您在用户上存储任何类型的数据。例如,在 ASP.NET 中,用户的角色存储为声明。要添加您自己的声明,您需要执行名为 claims transformation 的操作。然后检索信息你可以create a custom claims principal。将此添加到 SimpleSecurity 将是一个不错的功能。

    【讨论】:

    • 谢谢你。现在听起来更干净了。我理解你的观点,但是注册 WebMatrix 来初始化数据库对我来说听起来有点脏。我的用户表是域的一部分,我通过 UnitOfWork 实现了域访问。为什么 WebMatrix 不应该使用我的 DAL 来访问用户信息?为什么要“直接”连接到数据库?我假设我使用模型优先方法,我的域不需要初始化......当然,这是我的场景。顺便说一句,再次感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多