我目前正在开发一个MVC4项目,如果Ninject将一个UnitOfWork注入我的控制器,我会使用它,而我正在使用UnitOfWork + Generic Repository模式。
我不喜欢VS2012 MVC4模板,因为它直接使用数据库访问(例如db初始化)。
我的项目分为:
一个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来直接访问数据库?这段代码:
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);
}
打破了我与Domain的脱钩......我如何使用我的UnitOfWork制作WebSecurity?什么是最佳做法?
谢谢!
答案 0 :(得分:2)
你在这里有很多问题。让我来点吧。
如何注入UOW
静态类和依赖注入不能很好地混合,如pointed out in this QA。当我第一次完成解耦SimpleMembership的练习时,注意力就集中在与域的分离上,正如您引用的文章中所讨论的那样。这只是第一步,它可以改进,包括使依赖注入更容易。我讨论了是否将WebSecurity设置为静态,并且使用静态,因为这是原始SimpleMembership的实现方式,使其成为SimpleSecurity用户更加无缝的过渡。 SimpleSecurity是一个开源项目,欢迎提供。使其成为非静态并不困难,从长远来看可能是有意义的。一旦它变成非静态的,我们就可以使用Factory模式来创建UnitOfWork并注入相应的Factory。
为什么我必须注册WebSecurity?
SimpleSecurity只是WebMatrix WebSecurity类的包装器,需要初始化。 Register方法只是确保初始化WebMatrix并初始化我们的数据库。我不同意在Globa.asax中使用此方法调用以任何方式将其与域耦合。让它与UnitOfWork一起使用应该与Application Domain无关,或者必须在应用程序启动时调用Register方法。
如何存储其他数据(例如:电子邮件)并检索它,而不是每次都执行数据库查询?
使用ClaimsPrincipal在.NET 4.5中实际上很容易实现。 .NET 4.5中的所有主体都继承自ClaimsPrincipal,它允许您将信息存储在主体中作为声明。声明基本上是键值对,可以让您在用户上存储任何类型的数据。例如,在ASP.NET中,用户的角色存储为声明。要添加自己的声明,您需要执行一项名为claims transformation的操作。然后,您可以create a custom claims principal检索信息。将此添加到SimpleSecurity将是一个很好的功能。