我在考慮重構我的一些C#代碼,其中我已經使用實體框架6實現了存儲庫模式。它是一個ASP.NET MVC4網站。目前,我已經在我的存儲庫之上建立了一個服務層。服務層持有我的業務邏輯,如獲得所有用戶,其中X大於Y等我的服務層方法應該完全封裝一個工作單元嗎?
我的一個類似的項目,相同的實現是在這裏:https://github.com/ryancole/BetterArmory
眼下,一個客戶端我的圖書館會用我的圖書館,像這樣(沒有DI爲簡潔起見):
using (var context = new MyDbContext())
{
var userRepository = new MyUserRepository(context);
var userService = new MyUserService(userRepository);
var user = userService.getById(1);
user.Name = "Foo Bar";
context.SaveChanges();
}
以上,MyDbContext
是我的課,從EF6的繼承的DbContext。我的MyUserRepository
存儲庫類和所有其他回購,將上下文作爲arg。此外,服務類將適當的存儲庫類作爲arg。因此,我在想重構的東西是這個實現的泄漏,我覺得。在大多數情況下,從我的服務層返回的類都是EF6代理,並且可以直接使用SaveChanges
方法在DbContext
上修改,保存這些更改。這對我來說很難執行驗證,因爲我正在使用EF似乎沒有任何知識的Fluent驗證。據我所知,我必須在我的服務層方法中手動撥打Fluent Val的Validate
。這很糟糕,因爲對代理對象的直接更改不是通過服務層方法執行的。即使我有一個名爲SetUserEmail
的服務層方法,其中我使用Fluent Val驗證了實體,但用戶仍然可以直接編輯代理屬性。
所以我想知道,讓我的服務層初始化DbContext
,存儲庫並執行更改,調用任何所需的Fluent Val東西等等,都可能更好嗎?
這個問題的一些缺點可能是,延遲加載必須在服務方法中明確表示,或者只是一起禁用並加載所有內容。這是我現在能夠想到的,但我知道我還有其他的缺點,我想到了。
這很酷。不過,該網站並不喜歡我的包含我的'DbContext'的庫。它說它無法找到它。你有一些網站生成的代碼示例嗎? – Ryan
@Ryan,目前它只能用於MVC4和EF5。給我發電子郵件到[email protected],我將很樂意爲您發送一份工作樣本。 – Ronald