我试图在以后完全分离存储库/数据访问权限,同时仍在主项目中使用配置(通过appsettings.json)
我目前的解决方案是硬编码DbContext中OnConfiguring
方法中的连接字符串,这是不理想的。或者也许只为存储库层创建一个配置文件并从中读取。
我希望主项目(在这种情况下是Web服务)完全独立于数据访问层(因为我将使用服务层与其进行通信),但能够在启动时配置它使用默认的appsettings.json
有这样做的好方法吗?或者主项目必须引用存储库层。
项目布局:
Project.WebService
- Startup.cs
- EmployeeController.cs
- appsettings.json
Project.Service
- EmployeeService.cs
- EmployeeDTO.cs
Project.DAL
- DbContext.cs
- EmployeeRepository.cs
Project.Entities
- Employee.cs
WebService引用服务,服务引用DAL,DAL引用实体/ POCO
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
string connString = Configuration["AppSettings:ConnectionString"];
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<MyDbContext>(options => options.UseSqlServer(connString));
}
上面的DbContext在另一个类库中无论如何都不起作用。抛出以下异常。
类型&#39; System.InvalidOperationException&#39;的例外情况发生在 EntityFramework.Core.dll但未在用户代码中处理
其他信息:未配置任何数据库提供程序。 通过覆盖您的OnConfiguring来配置数据库提供程序 DbContext类或在设置时的AddDbContext方法 服务。
这就是我将连接字符串硬编码为OnConfiguring
方法的原因之一。
有没有人有任何好的方法/解决方案或我错过了什么? Web服务不需要知道它正在与哪个数据库通信,或者根本不需要它。它只是调用服务,接收DTO或发送DTO。
答案 0 :(得分:0)
连接所有依赖项 如果您真的坚持要求您的网络服务没有提及您的DAL,那么您可以随时尝试一下IT运营商&#39;层。
一些基础设施层(您可以调用实例&#34; InfratructureService&#34;,它引用了所有项目(webservice,Service,DAL,Entities)。在此基础架构层中,您创建了每个容器项目即将投入使用。
然后你的所有项目都应该有一个名为&#34; ConfigureMe&#34;或者某种东西,用1种方法称为&#34;配置&#34;例如。该方法将参数化为在InfratructureService中构建的容器的实例。在启动时,您的Web服务将提供&#34; InfratructureService&#34;一个标志来构建容器并调用每个&#34;配置&#34;每个&#34; ConfigureMe&#34;的方法它引用的每个项目的类。
在那些&#34;配置&#34;方法每个项目都可以在容器中注册自己的依赖关系。并且,所有依赖项都在容器中已知,而不会产生不必要的引用,并且可以通过构造函数注入来解决。
连接字符串问题: 至于你的硬编码连接字符串,你知道asp.net核心中的configuration吗?按照here所述设置配置后,您可以通过依赖注入将IOptions插入所需的任何位置。这也意味着你的DAL。
如果有什么不清楚或者你无法弄清楚,请告诉我。