在StartUp.cs中引用DbContext会破坏我在.NET Core应用程序

时间:2017-04-18 03:33:14

标签: c# entity-framework architecture asp.net-core onion-architecture

我正在努力想出一个能够正常流动的项目结构,但继续遇到路障。特别是我无法弄清楚EF的DbContext应该去哪里。我不希望我的API引用我的数据层。我唯一能想到的是将EntityFramework安装到Domain层并让DbContext驻留在那里。

TestProj.Data 类库(.NET Core)
实体框架已安装。包含UnitOfWork类,Repositories文件夹以及进行数据库调用的所有存储库。还将包含EF迁移。为其业务实体引用TestProj.Domain。

TestProj.Domain 类库(.NET Core)
具有所有业务实体的模型文件夹,IUnitOfWork接口以及TestProj.Data中存储库的所有接口,即ICustomerRepository。

TestProj.Api Web API项目(.NET Core)
我相信这应该只引用TestProj.Domain,但我还需要引用TestProj.Data来设置StartUp.cs中的所有服务,即

services.AddDbContext<TestProjDbContext>(options =>           options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddTransient<IUnitOfWork, UnitOfWork>();
        services.AddTransient<ICustomerRepository, CustomerRepository>();

这是我开始感到困惑的地方。

我的问题:
Api项目是否可以引用域和数据项目?好像我需要在StartUp.cs

中设置依赖注入

我是否正在为Domain项目中的所有内容添加接口?

TestProjDbContext应该为EF做什么项目?我最初的想法是数据项目?

DTO / Pocos等物品去哪儿了?在API项目或Domain项目中?假设API可以安装AutoMapper,并且因为它引用了TestProj.Domain,可以将原始业务实体映射到API中的DTO。

最后,业务逻辑在哪里?数据层和API之间的规则。我假设正确的地方是TestProj.Domain。如果API只调用域中的业务逻辑而不是将IUnitOfWork注入到我的api控制器中,我会注入TestProj.Domain.Services.CustomerService,这可能会解决我的问题。这有意义吗?

1 个答案:

答案 0 :(得分:2)

我对此的看法:

  

Api项目是否可以引用域和数据项目?

对我来说没关系。

  

我是否正在为Domain项目中的所有内容添加接口?

YES

  

TestProjDbContext应该为EF做什么项目?我最初的想法是数据项目?

我通常将BlahBlahContext类放入Domain项目

  

DTO / Pocos等物品去哪儿了?在API项目或域项目中?

我为这个名为Dto的不同项目做了。然后在需要时引用它。

  

假设API可以安装AutoMapper,并且因为它引用了TestProj.Domain,可以将原始业务实体映射到API中的DTO。

不确定

  

最后,业务逻辑在哪里?数据层和API之间的规则。

我在解决方案中用于这个不同的项目 - &gt;称为服务

希望这有帮助。