【发布时间】:2016-11-10 15:33:38
【问题描述】:
我正在使用 ASP.NET Core 并使用 DI 来构建散列功能。因为我不知道现阶段使用的散列类型(我们将其存储在持久存储中)。
ICrypto合约
public interface ICrypto
{
string HashPassword(string plainPassword);
bool VerifyHashedPassword(string hashedPassword, string providedPassword);
}
我有几个 ICrypto 的实现,它们只是包装其他库并提供 ICrypto 签名的实现。例如:
- CryptoMD5
- CryptoSHA1
- CytpoOther
现在,在 UserService 中,我注入 ICyrpto 以散列密码,例如:
Public class UserService
{
ICrypto _crypto;
public UserService(ICrypto crypto)
{
_crypto = crypto;
}
public bool Login (string username, string password)
{
//code omitted
var hash = _crypto.HashPassword(password);
}
}
在启动类中为容器添加依赖
//get encryption type stored in cache, db or somewhere
var cryptoType = //get param
if (cryptoType = "SHA1")
{
services.AddTransient<ICrypto, CryptoSHA1>();
}
else if (cryptoType = "MD5")
{
services.AddTransient<ICrypto, CryptoMD5>();
}
我正在寻找一种根据最佳实践执行此操作的方法,并将反映 Steves 提到的内容。
【问题讨论】:
-
工厂不违反 DI,您确实误读了 Stevens 的回答。您使用的是静态工厂,这违反了 IoC/DI 的解耦性质。如果你注入你的工厂,它就完美了
-
@h.salman,在我看来,你做错了。您在您的服务中注入 ICrypto。这意味着您想要注入一个可以加密/解密您的数据的对象,而不管算法如何。否则,您将直接注入 ICryptoSHA1 或 ICryptoMD5。所以,或者你注入一个可以加密/解密许多算法的 ICrypto,或者你定义你需要的类型,然后注入正确的。
-
@FabricioKoch,请通过回答问题并说明如何实现这一点来说明这一点。
-
@Tseng 不完全是。正如我所解释的here,工厂抽象经常违反依赖倒置原则,这是依赖注入背后的驱动力。
-
我将使用
Crypt(string text, string algorithm)和Decrypt(string text, string algorithm)方法创建一个ICrypto。
标签: c# design-patterns dependency-injection asp.net-core inversion-of-control