Sun*_*oot 7 nhibernate asp.net-mvc castle-windsor ioc-container inversion-of-control
我正在构建一个ASP.NET MVC应用程序,它使用DDD(域驱动设计)方法,由NHibernate处理数据库访问.我有域模型类(管理员),我想通过一个IOC容器,如Castle Windsor注入依赖,如下所示:
public class Administrator
{
public virtual int Id { get; set; }
//.. snip ..//
public virtual string HashedPassword { get; protected set; }
public void SetPassword(string plainTextPassword)
{
IHashingService hasher = IocContainer.Resolve<IHashingService>();
this.HashedPassword = hasher.Hash(plainTextPassword);
}
}
Run Code Online (Sandbox Code Playgroud)
我基本上想要为SetPassword方法注入IHashingService而不直接调用IOC容器(因为这被认为是IOC反模式).但我不知道如何去做.我的Administrator对象要么通过实例化,new Administrator();
要么通过NHibernate加载,那么我如何将IHashingService注入Administrator类?
再想一想,我是否正确地走这条路?我希望避免让我的代码库乱丢......
currentAdmin.Password = HashUtils.Hash(password, Algorithm.Sha512);
Run Code Online (Sandbox Code Playgroud)
...而是让域模型本身处理哈希并巧妙地将其封装起来.我可以设想另一个开发人员意外地选择了错误的算法,并且有一些密码为Sha512,有些是MD5,有些有一个盐,有些有不同的盐等等.相反,如果开发人员正在写...
currentAdmin.SetPassword(password);
Run Code Online (Sandbox Code Playgroud)
...然后那会隐藏这些细节并处理上面列出的那些问题不是吗?
SO上已有类似的问题:
你需要使用拦截器.看看Fabio Maulo的实施帖子:
http://nhforge.org/blogs/nhibernate/archive/2008/12/12/entities-behavior-injection.aspx