0

我目前正在开发一个 MVC4 项目,如果 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 - 有人让它对 n 层友好吗?

现在我有一个问题:

  • 我怎样才能在这里注入我的 UoW?WebSecurity 类是静态的,没有构造函数,它直接实例化 UoW 以在 db 上执行活动......

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

        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 ... ASP.NET MVC 中的自定义主体

谢谢!

4

1 回答 1

2

你有很多问题在这里 Marco。让我对他们刺一下。

如何注入 UOW

正如本 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 中,用户的角色存储为声明。要添加您自己的声明,您需要执行一些称为声明转换的操作。然后要检索信息,您可以创建自定义声明主体。将此添加到SimpleSecurity将是一个不错的功能。

于 2013-03-27T15:09:23.587 回答