我試圖想出一個能正常流動的項目結構,但仍然會跑進路障。特別是我無法弄清楚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。這有意義嗎?
當然,這可能會因爲太過於自負而關閉。但是這裏有些東西供你考慮。如果某件事正在使用DbContext,則無法阻止它引用EF庫。你可能想要做的是讓你的API使用類似'List'這樣的通用結構,或者不用。你可能要考慮這些架構:http://jeffreypalermo.com/blog/the-onion-architecture-part-1/或http://codingcanvas.com/hexagonal-architecture/ –
此外,工作單位是多餘的,如果你正在使用DbContext,因爲DbContext已經是一個工作單元。幾乎每個創建這種抽象的人都會通過(像IQueryables)泄漏實現細節,這使實際交換數據技術變得困難。 –
@ErikFunkenbusch不一定。是的,EF基本上是一個工作單元,但如果我想用不同的ORM交換它,關於分離問題又該如何呢?此外,在整個應用程序中試圖減少重複代碼/查詢邏輯的數量。用W/EF實現UoW和Repository模式的原因很多。 –