-1

我試圖想出一個能正常流動的項目結構,但仍然會跑進路障。特別是我無法弄清楚EF的DbContext應該去哪裏。我不希望我的API引用我的數據層。我能想到的唯一事情是將EntityFramework安裝到域圖層,並讓DbContext駐留在那裏。在StartUp.cs中引用DbContext正在搞亂我在.NET中的體系結構核心應用程序

TestProj.Data類庫安裝(.NET核心)
實體框架。包含UnitOfWork類,包含所有存儲庫的Repositories文件夾,用於進行數據庫調用。還將包含EF遷移。爲業務實體引用TestProj.Domain。

TestProj.Domain類庫(.NET核心)的所有業務實體,IUnitOfWork接口和所有在TestProj.Data即ICustomerRepository存儲庫的接口
Models文件夾。

TestProj.Api的Web API項目(.NET核心)
我相信這應該只引用TestProj.Domain,但我需要引用TestProj.Data也爲了建立所有服務處於啓動.cs,即

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

這是我開始感到困惑的地方。

我的問題:
是不是不行了的API項目同時引用域和數據的項目?似乎我需要在StartUp.cs中設置依賴注入

是否正確,我將所有接口都放在Domain項目中?

TestProjDbContext應該爲EF設置哪個項目?我最初的想法是數據項目?

DTOs/Pocos等項目去哪裏?在API項目或域項目中?假設API可以安裝AutoMapper,並且它引用了TestProj.Domain,可以將原始業務實體映射到API中的DTO。

最後,業務邏輯去哪裏?數據層和API之間的規則。我假設適當的地方是TestProj.Domain。也許這會解決我的問題,如果API只調用域中的業務邏輯,而不是將IUnitOfWork注入到我的api控制器中,那麼我會注入TestProj.Domain.Services.CustomerService。這有意義嗎?

+0

當然,這可能會因爲太過於自負而關閉。但是這裏有些東西供你考慮。如果某件事正在使用DbContext,則無法阻止它引用EF庫。你可能想要做的是讓你的API使用類似'List '這樣的通用結構,或者不用。你可能要考慮這些架構:http://jeffreypalermo.com/blog/the-onion-architecture-part-1/或http://codingcanvas.com/hexagonal-architecture/ –

+0

此外,工作單位是多餘的,如果你正在使用DbContext,因爲DbContext已經是一個工作單元。幾乎每個創建這種抽象的人都會通過(像IQueryables)泄漏實現細節,這使實際交換數據技術變得困難。 –

+0

@ErikFunkenbusch不一定。是的,EF基本上是一個工作單元,但如果我想用不同的ORM交換它,關於分離問題又該如何呢?此外,在整個應用程序中試圖減少重複代碼/查詢邏輯的數量。用W/EF實現UoW和Repository模式的原因很多。 –

回答

2

我對這個問題的意見:

是不是不行了的API項目同時引用域和數據的項目?

對我來說沒問題。

這是正確的,我把所有的接口在域項目?

應TestProjDbContext坐什麼項目EF?我最初的想法是數據項目?

我通常把BlahBlahContext全班分成領域工程

哪裏像DTO的項目/波蘇斯去?在API項目或域項目中?

我這個不同的項目,叫做DTO製造。然後在需要時引用它。

假設API可以安裝AutoMapper,並且由於它引用TestProj.Domain可以將原始業務實體映射到API中的DTO。

當然

最後,哪裏的業務邏輯去了?數據層和API之間的規則。

我在解決方案中使用此不同的項目 - >叫服務

希望這有助於。

+0

優秀的迴應!所以你只是說把DbContext放在Domain項目中,Api和Data項目都可以從那裏引用。在StartUp.cs中配置ef sqlserver服務時,我遇到了困難,因爲您需要將它傳遞給DbContext。我不想從Api引用我的數據項目來執行此操作。即使你說這是好的,我更喜歡Api只知道服務項目。這還好嗎? –

+0

>我不想從Api中引用我的數據項目來執行此操作。 - >你打算如何在Api中使用Data項目類?你需要引用它,因爲你需要這個用於Automapper。 「我更喜歡Api只知道服務項目。」 - >這很好(我的意思是我不喜歡把業務邏輯放到Api中,使用服務要好得多) – paulpeters

+0

我計劃只通過服務在Api中使用Data Project類(只有服務將與Data項目交談函數)..例如,甚至沒有像GetCustomerById和GetCustomers這樣的業務邏輯的基本類將從CustomerService中調用,這樣我只是將ICustomerService注入到我的控制器中。在Api/Mvc控制器中注入服務和存儲庫是否正常?我假設服務也會打電話給知識庫。我認爲這是我大部分困惑的地方。 –

相關問題