依赖注入到链接在一起的类库中?

时间:2018-07-13 12:36:08

标签: c# .net dependency-injection .net-core

我很难解决这个问题。这是一个.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的实现,以便它可以根据需要加密/解密用户信息。

我觉得自己正处于将这些整合在一起的风口浪尖,但是我不了解将其链接在一起的正确方法。

1 个答案:

答案 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的关系。对于单元测试来说这是一件好事。