class 库中的 EF Core 并从 API 项目中使用 - 如何将配置信息传递给 class 库?
EF Core in class library and use from API project - How to pass config information to class library?
我已经使用 .net 核心 class 库项目和 asp.net 核心网络 api 项目设置了一个解决方案。为了使用我的 class 库,我通过 ConfigureServices 添加了接口,其中 DataRepo 是 class 库中的一个 class。
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IDataRepo, DataRepo>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
此 class 库需要获取将在 API 项目文件 appsettings.json 中的特定于环境的连接字符串。如何将配置设置传递给它?另外,我想在库项目中添加一个 EF 核心数据模型,我不想在 API 项目中注册 DbContext,而是在我的库的构造函数中,使用连接信息与配置一起传递数据库上下文。首先,如何将配置设置从 appsettings.json 获取到我的 class 库?
namespace DataLib
{
public class DataRepo : IDataRepo
{
public DataRepo()
{
}
public string GetHello()
{
return "hello from lib";
}
}
}
- 如果您只想在一个 lib 项目和一个网站项目之间共享配置,您最好使用依赖注入来做到这一点。
lib项目不应该关心配置文件的位置。任何时候我们需要在我们的 lib 项目中进行配置,比如 ConnectionString
,我们应该直接请求它。
首先要做的是在lib项目中添加包引用:
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.1" />
然后在我们需要的时候注入一个IConfiguration
。例如,我们应该在 DataLib
:
中注入一个 IConfiguration
对象
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 .
当我们在主项目中需要 class 库时,我们可以简单地将服务添加到 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项目中。
- 还有其他解决方案,例如使用链接文件等。但是,上述方法使 DataLib 保持为普通的 POCO。这很棒 。由于 lib 总是被主项目使用,我们不需要关心配置或它是如何创建的。主要项目会处理它。
如果您的 class 需要连接字符串,则只需将连接字符串提供给它即可。您可以为 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")));
您的 class 不应该知道或关心连接字符串实际来自哪里,这就是为什么其他方法,例如注入 IConfiguration
在这里是错误的。
我已经使用 .net 核心 class 库项目和 asp.net 核心网络 api 项目设置了一个解决方案。为了使用我的 class 库,我通过 ConfigureServices 添加了接口,其中 DataRepo 是 class 库中的一个 class。
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IDataRepo, DataRepo>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
此 class 库需要获取将在 API 项目文件 appsettings.json 中的特定于环境的连接字符串。如何将配置设置传递给它?另外,我想在库项目中添加一个 EF 核心数据模型,我不想在 API 项目中注册 DbContext,而是在我的库的构造函数中,使用连接信息与配置一起传递数据库上下文。首先,如何将配置设置从 appsettings.json 获取到我的 class 库?
namespace DataLib
{
public class DataRepo : IDataRepo
{
public DataRepo()
{
}
public string GetHello()
{
return "hello from lib";
}
}
}
- 如果您只想在一个 lib 项目和一个网站项目之间共享配置,您最好使用依赖注入来做到这一点。
lib项目不应该关心配置文件的位置。任何时候我们需要在我们的 lib 项目中进行配置,比如 ConnectionString
,我们应该直接请求它。
首先要做的是在lib项目中添加包引用:
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.1" />
然后在我们需要的时候注入一个IConfiguration
。例如,我们应该在 DataLib
:
IConfiguration
对象
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 .
当我们在主项目中需要 class 库时,我们可以简单地将服务添加到 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项目中。
- 还有其他解决方案,例如使用链接文件等。但是,上述方法使 DataLib 保持为普通的 POCO。这很棒 。由于 lib 总是被主项目使用,我们不需要关心配置或它是如何创建的。主要项目会处理它。
如果您的 class 需要连接字符串,则只需将连接字符串提供给它即可。您可以为 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")));
您的 class 不应该知道或关心连接字符串实际来自哪里,这就是为什么其他方法,例如注入 IConfiguration
在这里是错误的。