使用DAL

时间:2016-03-14 21:23:11

标签: c# asp.net entity-framework

我试图在以后完全分离存储库/数据访问权限,同时仍在主项目中使用配置(通过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。

1 个答案:

答案 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。

如果有什么不清楚或者你无法弄清楚,请告诉我。