【发布时间】:2018-07-13 12:36:08
【问题描述】:
我很难弄清楚这应该如何工作。这是针对 .NET Core 应用程序的。
我有一个定义 ICryptoService 的加密库和一个实现类 DefaultCryptoService,我还有一个 CryptoSettings 类,我在启动时从 appsettings.json 填充。所以:
public class DefaultCryptoService : ICryptoService {
private CryptoSettings cryptoSettings;
public DefaultCryptoService(CryptoSettings settings){
cryptoSettings = settings;
}
}
在我的启动中:
services.AddSingleton<ICryptoProvider>(new DefaultCryptoProvider(cryptoSettings));
到目前为止一切顺利。但是现在想象一下,我在另一个类库中有一个数据层,它需要利用这些加密功能并连接到数据库。它基本上是实现基本 IRepository 模式的存储库类。我的控制器将根据需要调用 IRepository 实现以使用数据库,但是该层如何访问我在 Startup 中初始化的 ICryptoProvider 实现?
HomeController --> UserRepository --> 需要访问 DatabaseSettings(从配置,就像我的加密一样),以及我在启动时设置的 ICryptoProvider 的实现,以便它可以根据需要加密/解密用户信息。
我觉得我正处于将所有这些放在一起的风口浪尖,但我不了解将它们链接在一起的正确方法。
【问题讨论】:
-
how does that layer get access to the ICryptoProvider implementation that I initialized in Startup?通过将ICryptoProvider作为构造函数依赖。您对 IoC 容器(以及哪些容器)有多少经验? -
@mjwills 所以你的意思是我所有的存储库现在都必须定义同时采用 DatabaseSettings 和 CryptoSettings 的构造函数?好吧,我想,但是如果你有很多依赖项,这不是很丑吗?我可以看到需要访问各种不同库的数据层
-
OK I guess, but doesn't this get really ugly if you have many dependencies?你建议什么替代方案?它必须以某种方式获得它的依赖关系。另一种选择是服务定位器 - 这更糟。
标签: c# .net dependency-injection .net-core