Я создаю приложение ASP.NET MVC, которое использует подход DDD (Domain Driven Design) с доступом к базе данных, обрабатываемым 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);
}
}
В основном я хочу внедрить IHashingService для метода SetPassword без непосредственного вызова контейнера IOC (поскольку предполагается, что это анти-шаблон IOC). Но я не уверен, как это сделать. Мой объект Administrator либо создается с помощью new Administrator();
, либо загружается с помощью NHibernate, так как бы я внедрил IHashingService в класс Administrator?
Если подумать, правильно ли я поступлю? Я надеялся избежать засорения моей кодовой базы ...
currentAdmin.Password = HashUtils.Hash(password, Algorithm.Sha512);
... и вместо этого заставьте саму модель домена заботиться о хешировании и аккуратно ее инкапсулировать. Я могу предположить, что другой разработчик случайно выберет неправильный алгоритм и будет иметь несколько паролей, например, Sha512, некоторые - как MD5, некоторые с одной солью, некоторые с другой солью и т.д.
currentAdmin.SetPassword(password);
... тогда это скрыло бы эти детали и решило бы проблемы, перечисленные выше, не так ли?