我很难解决这个问题。这是一个.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的实现,以便它可以根据需要加密/解密用户信息。
我觉得自己正处于将这些整合在一起的风口浪尖,但是我不了解将其链接在一起的正确方法。
答案 0 :(得分:1)
您只需注册您的类型并提供定义需求的公共构造函数,如果这些需求可用,魔术就会发生。带上您的加密货币提供商,您可能需要另外注册:
services.AddSingleton(cryptoSettings);
services.AddSingleton<ICryptoProvider, DefaultCryptoProvider>();
如果以这种方式编写,它将得到解决。实际上,您不必直接在代码中的任何地方调用构造函数,这将通过依赖性解析为您完成。
还要检查服务收集的不同方法-并非所有类都应该是单例。
class UserRepository : IUserRepository{
UserRepository(IDatabaseContext context, ICryptoProvider provider){
}
}
并注册:
services.AddTransient<IUserRepository, UserRepository>();
您还需要添加数据库上下文以解决此存储库。 这可以是非常深的结构,您可以想象控制器不是直接与存储库一起工作,而是有一些服务层:
class UserService : IUserService{
UserService(IUserRepository userReposiotry, IMembershipRepository membershipRepository){
}
}
和控制器构造函数是这样的:
UserController(IUserService service){
}
从控制器的角度来看,您不必担心需要两个存储库,而每个存储库都需要数据库上下文和加密提供程序。控制器仅需要验证有效负载,如果有效,则将作业委派给服务进行处理。反过来,服务则不在乎存储库的内部逻辑和要求。
对于注册,它是services
集合AddTransient<Interface,Class>()
上的一系列调用。是的,您将在接口和类之间获得1:1的关系。对于单元测试来说这是一件好事。