Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何调用实现DI的另一个项目的方法_C#_.net_Dependency Injection_Containers - Fatal编程技术网

C# 如何调用实现DI的另一个项目的方法

C# 如何调用实现DI的另一个项目的方法,c#,.net,dependency-injection,containers,C#,.net,Dependency Injection,Containers,我想我实现了一个糟糕的架构。请跟我来 我有project1,它是一个简单的刮刀。每当它收到来自其刮取过程的响应时,它都希望将刮取的数据保存到数据库中。它有自己的DI容器 我有project2,它负责执行DB迁移,我还将访问和修改数据库的逻辑放在这里。我想把管理数据库的所有逻辑只放在一个地方。它有自己的DI容器 最后,我有project3,这是一个API,无论何时被要求,它都为数据库中存储的数据提供服务。它有自己的DI容器 正如你所看到的,Projt2位于中间,在保存数据和用于服务数据的API项目

我想我实现了一个糟糕的架构。请跟我来

我有project1,它是一个简单的刮刀。每当它收到来自其刮取过程的响应时,它都希望将刮取的数据保存到数据库中。它有自己的DI容器

我有project2,它负责执行DB迁移,我还将访问和修改数据库的逻辑放在这里。我想把管理数据库的所有逻辑只放在一个地方。它有自己的DI容器

最后,我有project3,这是一个API,无论何时被要求,它都为数据库中存储的数据提供服务。它有自己的DI容器

正如你所看到的,Projt2位于中间,在保存数据和用于服务数据的API项目时,它被刮刀项目使用。 在project2中,我的DI注册如下所示:

private static IServiceCollection ConfigureServices(IConfiguration Configuration)
{
    IServiceCollection services = new ServiceCollection();

    // Inject IOptions<T>
    services.AddOptions();
    var dbSettings = Configuration.GetSection("Settings");
    services.Configure<DbSettings>(dbSettings);

    return services;
}
它所做的是查看应用程序设置,只有一个连接字符串指向已保存的数据库,并准备在需要时注入IOption。 因此,在project2中有一个示例,例如检查DB是否为空的方法

public class DbClient : IDbClient
{
    private readonly IOptions<DbSettings> _dbSettings;
    public DbClient(IOptions<DbSettings> dbSettings)
    {
        _dbSettings = dbSettings;
    }

    public bool IsDbEmpty()
    {
        using (SqlConnection connection = new SqlConnection(_dbSettings.Value.ConnectionString))
        {
            var isEmpty = connection.QueryFirst<string>("SELECT COUNT(1) WHERE EXISTS (SELECT * FROM Test)");
            Console.ReadLine();
        }
    }
}

猜猜问题出在哪里?每当我尝试从project1或project3或API调用此方法时,不会注入IOptions,因为我没有调用project2的容器。我如何解决这个问题?提前谢谢

一种方法是让您的共享项目2公开一些可供消费应用程序project1和project3使用的配置功能

对于.NET Core,您可以通过在共享项目2中定义IServiceCollection扩展方法来实现这一点:


请注意,然后您可以在使用project2的任何项目中定义project2所需的配置。

project2是否需要自己的容器?听起来它应该是project1和project1使用的类库project3@devNull不一定。。但是,如果不使用IOption,因此使用DI模式,我如何将连接字符串传递给方法呢。。原因是,当您从例如project1调用扩展方法时,必须通过IConfiguration。。在这种情况下,您传递的IConfiguration是project1的IConfiguration,它不包含project2..@Tarta的appsettings,因此我的评论是,您可以在使用它的任何项目中定义project2所需的配置。这通常是配置的工作方式。如果这些设置是可配置的,那么您只需在AddProject2方法中硬编码即可。哦,现在我明白了!但这样一来,我不再保留我试图通过分离角色来实现的单一责任。我的意思是,我想在项目中保留与数据库相关的所有内容2。。通过这种方式,现在我还必须在另一个数据库中定义连接字符串projects@Tarta潜在地虽然也有解决这个问题的办法,比如
public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddProject2(this IServiceCollection services, IConfiguration configuration)
    {
        services.AddOptions();
        var dbSettings = configuration.GetSection("Settings");
        services.Configure<DbSettings>(dbSettings);

        return services;
    }
}
public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddProject2(Configuration);

    ...
}