EF Core在类库中并从API项目中使用-如何将配置信息传递给类库?

时间:2018-09-03 21:49:43

标签: asp.net-core ef-core-2.1

我已经使用.net核心类库项目和asp.net核心Web api项目设置了解决方案。为了使用我的类库,我通过ConfigureServices添加了接口,其中DataRepo是类库中的类。

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IDataRepo, DataRepo>();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

此类库需要获取特定于环境的连接字符串,该字符串将在API项目文件appsettings.json中。如何将配置设置传递给它?另外,我想在库项目中添加一个EF核心数据模型,而不是在API项目中注册一个DbContext,而是在我的库的构造函数中,使用连接信息与DbContext中的配置一起传递。首先,如何将appsettings.json中的配置设置获取到我的类库中?

namespace DataLib
{
    public class DataRepo : IDataRepo
    {

        public DataRepo()
        {

        }

        public string GetHello()
        {
            return "hello from lib";
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果您的班级需要连接字符串,则只需为其提供连接字符串。您可以将AddScoped的重载用于Action<T>

首先,添加一个使用您的连接字符串的构造函数:

public class DataRepo : IDataRepo
{
    private readonly string _connectionString;

    public DataRepo(string connectionString)
    {
        _connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
    }
}

然后,在Startup.cs中:

services.AddScoped<IDataRepo>(p => new DataRepo(Configuration.GetConnectionString("Foo")));

您的班级不应该知道或关心连接字符串的实际来源,这就是为什么其他方法(例如注入IConfiguration)在这里是错误的。

答案 1 :(得分:1)

  1. 如果您只想在lib项目和网站项目之间共享配置,则最好使用依赖项注入来实现。

lib项目不应该关心配置文件的位置。每当我们在lib项目中需要配置时,比如说ConnectionString,我们都应该要求它。

首先要做的是在lib项目中添加一个包引用:

 <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.1" />

然后在需要时注入IConfiguration。例如,我们应该在IConfiguration中插入一个DataLib对象:

namespace DataLib
{
    public class DataLib: IDataRepo
    {
        private readonly IConfiguration _configuration ;
        public DataLib(IConfiguration config ){
            this._configuration=config;
        }

        public string ConnectionString{
            get{
                return _configuration.GetConnectionString("DefaultConnection");
            }
        }
    }
}

IConfiguration不在乎配置文件在哪里,或者在启动时通过命令行传递了哪些类型的参数。实际上,它什么都不在乎。 DataLib仅使用一个简单的POCO。

当我们在主项目中需要类lib时,我们可以简单地通过以下方式将服务添加到DI容器中:

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddScoped<DataLib.DataLib>(); // if you want to use DbContext , just use AddScoped<TService>()

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

这就是我们要做的。 appsettings.json和其他配置将内置到IConfiguration的实例中,然后自动注入到lib项目中。

  1. 还有其他解决方案,例如使用链接文件等。但是,以上方法使DataLib保持了简单的POCO。这很棒 。由于lib通常由主项目使用,我们不需要在意配置或创建方法。主要项目将解决这个问题。