開發筆記:用不用UnitOfWork以及Repository返回什麼集合型別
這2天實際開發中明確的東西,在這篇博文中記錄一下。
之前對是否需要自己封裝UnitOfWork有些猶豫,因為Entity Framework就是一個UnitOfWork實現, 自己再封裝一下顯得有些多餘。
但是在這次開發中,把涉及資料庫操作的實現程式碼放在最後寫,先完成其他層的程式碼。這種情況下,根本用不了EF,只能先Fake出一個UnitOfWork,這時必須要進行UnitOfWork的封裝。
所以,定義了IUnitOfWork介面並實現了一個FakeUnitOfWork,簡化的示例程式碼如下:
IUnitOfWork
public interface IUnitOfWork : IDisposable { TEntity Add<TEntity>(TEntity entity) where TEntity : class; Task CommitAsync(); }
FakeUnitOfWork
public class FakeUnitOfWork : IUnitOfWoerk { private IList _entities = new List<object>(); public TEntity Add<TEntity>(TEntity entity) where TEntity : class {var property = typeof(TEntity).GetProperty("ID"); if(property != null) { property.SetValue(entity, new Random().Next()); } _entities.Add(entity); return entity; } public async Task CommitAsync() { var bits = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(_entities, Newtonsoft.Json.Formatting.Indented));using (var fs = new FileStream( path: @"C:\temp\FakeUnitOfWork.json", mode: FileMode.Create, access: FileAccess.Write, share: FileShare.None, bufferSize: 4096, useAsync: true)) { await fs.WriteAsync(bits, 0, bits.Length); } } }
到寫資料庫操作程式碼時,基於EF實現一下IUnitOfWork介面即可。
接下來是Repository返回集合型別的問題。
之前Repository介面多數返回的是IList<T>,這樣使用的一個考慮就是讓涉及資料庫查詢的操作儘量在Repository層完成,避免在Application層進行資料庫查詢操作。
但是今天在Application層的Service中用到了AutoMapper的Project功能,Project的好處是讓EF生成的SQL只查詢DTO中的欄位,但Project擴充套件方法是針對(且只能針對)IQureryable<T>介面的,所以不得不將Repository介面的返回型別改為IQureryable<T>。
考慮到Project的巨大吸引力以及為了保持Repository返回型別的一致,以後Repository就都統一返回IQureryable<T>吧。
示例程式碼如下:
IBlogCategoryRepository
public interface IBlogCategoryRepository { Task<IQueryable<BlogCategory>> GetCategoriesByBlogId(int blogId, bool activeOnly); }
BlogCategoryService
public class BlogCategoryService : IBlogCategoryService { private IBlogCategoryRepository _blogCategoryRepository; public BlogCategoryServiceImp(IBlogCategoryRepository blogCategoryRepository) { _blogCategoryRepository = blogCategoryRepository; } async Task<IList<BlogCategoryDto>> IBlogCategoryService.GetCategoriesByBlogId(int blogId, bool activeOnly) { return (await _blogCategoryRepository .GetCategoriesByBlogId(blogId, activeOnly)) .Project() .To<BlogCategoryDto>() .ToList(); } }
相關推薦
開發筆記:用不用UnitOfWork以及Repository返回什麼集合型別
這2天實際開發中明確的東西,在這篇博文中記錄一下。 之前對是否需要自己封裝UnitOfWork有些猶豫,因為Entity Framework就是一個UnitOfWork實現, 自己再封裝一下顯得有些多餘。 但是在這次開發中,把涉及資料庫操作的實現程式碼放在最後寫,先完成其他層的程式碼。這種情況下,根本用不
開發筆記:基於EntityFramework.Extended用EF實現指定欄位的更新
今天在將一個專案中使用儲存過程的遺留程式碼遷移至新的架構時,遇到了一個問題——如何用EF實現資料庫中指定欄位的更新(根據UserId更新Users表中的FaceUrl與AvatarUrl欄位)? 原先呼叫儲存過程的程式碼: public bool UpdateAvatar(Guid userId, s
《微信小程式專案開發實戰:用WePY、mpvue、Taro打造高效的小程式》(筆記3)支援Vue.js語法的mpvue框架
(1)保證npm和Node.js的可用性後,使用如下程式碼安裝Vue.js環境。 # 全域性安裝 vue-cli # 如果是Linux或者Unix等一般是要 sudo 許可權的 npm install --global [email protected] 在Windows中使用CMD安裝環境,安裝效果如圖10
張高興的 Windows 10 IoT 開發筆記:使用 ULN2003A 控制步進電機
uln2003 zhang windows iot ges 開發 ima dem win GitHub:https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/ULN2003A 張高興的 Wind
張高興的 Windows 10 IoT 開發筆記:三軸數字羅盤 HMC5883L
cnblogs -i mas https http png 開發 target 分享 註意,數據不包含校驗,準確的來說我不知道怎麽校驗,但方向看起來差不多是對的。。。 GitHub:https://github.com/ZhangGaoxing/windows-io
微信開發筆記-調用自定義分享接口
彈出菜單 菜單 開發筆記 n-1 onf target ready 模式 時間戳 文章來自:http://www.cnblogs.com/ysyn/archive/2015/07/23/4665897.html 引言: 工作中開發微信網站,簡稱微網站。由於微
張高興的 Xamarin.Forms 開發筆記:為 Android 與 iOS 引入 UWP 風格的漢堡菜單 ( MasterDetailPage )
操作 using eat stp 取消 height 新建 屬性 turn 所謂 UWP 樣式的漢堡菜單,我曾在“張高興的 UWP 開發筆記:漢堡菜單進階”裏說過,也就是使用 Segoe MDL2 Assets 字體作為左側 Icon,並且左側使用填充顏色的矩形用來表示
張高興的 Windows 10 IoT 開發筆記:BMP180 氣壓傳感器
bsp git left margin 氣壓 play 氣壓傳感器 分享 get 原文:張高興的 Windows 10 IoT 開發筆記:BMP180 氣壓傳感器 註意:海拔高度僅供參考 GitHub : https://github.com/ZhangGaoxin
張高興的 Windows 10 IoT 開發筆記:使用 MAX7219 驅動 8×8 點陣
.com 使用 window win get mas image href git 原文:張高興的 Windows 10 IoT 開發筆記:使用 MAX7219 驅動 8×8 點陣 GitHub:https://github.com/ZhangGaoxing/w
張高興的 Windows 10 IoT 開發筆記:DHT11 溫濕度傳感器
分享 lock spl .com play ima image log win 原文:張高興的 Windows 10 IoT 開發筆記:DHT11 溫濕度傳感器 GitHub : https://github.com/ZhangGaoxing/windows-iot-de
張高興的 Windows 10 IoT 開發筆記:ToF Sensor VL53L0X
mar 分享 demo isp 技術 ref windows ges mas GitHub : https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/VL53L0X 張高興的 Windows 10 Io
張高興的 Windows 10 IoT 開發筆記:紅外溫度傳感器 MLX90614
ima master lock right win hang tps iot pla GitHub : https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/MLX90614 張高興的 Windows
張高興的 Windows 10 IoT 開發筆記:使用 Lightning 中的軟件 PWM 驅動 RGB LED
pic pwm 原生 感覺 發現 rgb rgb led ace light 感覺又幫 Windows 10 IoT 開荒了,所以呢,正兒八經的寫篇博客吧。其實大概半年前就想寫的,那時候想做個基於 Windows 10 IoT 的小車,但樹莓派原生不支持 PWM 啊。百度也
純前端開發案例:用 SpreadJS 搭建信息系統軟件開發平臺
Js Excel 前端表格 前端Excel 一. 企業背景福建華閩通達信息技術有限公司成立於 2007 年,是一家致力於工程項目管理、電子政務、電子商務及企業 ERP 實現的 SAAS、PAAS 服務提供商,整合工程管理各環節的資源,構建行業健康生態鏈。二. 項目概況R 平臺采用了面向業務人員的開
android開發筆記:MainActivity.java與activity_main.xml
https://www.jianshu.com/p/f5e56fb2f215 剛開始開發android的時候,新建一個activity總是會新建兩個檔案,我們已預設命名MainActivity.java與activity_main.xml兩個檔案來給大家介紹。 activity
Linux應用程式開發筆記:測試程式碼執行時間
#include <stdio.h> #include <sys/times.h> #include <unistd.h> void main(void) { double duration; clock_t start,
Linux應用程式開發筆記:make menuconfig環境搭建
1、目的 Linux應用程式開發採用與Linux核心一致的menuconfig圖形配置,方便功能元件裁剪。 2、準備工作 下載:Kconfiglib原始碼(https://github.com/ulfalizer/Kconfiglib) 3、環境搭
Unity遊戲開發筆記:獲取主角周圍的怪物
1、獲取距離主角最近的一個怪物 方法一:球形射線檢測,Physics.OverlapSphere 用球形射線檢測主角周圍方圓X米的怪物,如果檢測到怪物,即可返回此怪物,如果沒有檢測到怪物,將檢測範圍(即半徑)擴大,直到檢測到怪物為止。 public Transform OnG
機器學習學習筆記:用MiniVGGNet處理Cifar-10資料集
0. 引言 VGGNet,由Simonyan和Zisserman在2014年提出,論文名字是《Very Deep Learning Convolutional Neural Networks for Large-Scale Image Recognition》。他們做出的貢
IOS開發筆記:編譯時出現的錯誤和解決辦法
1、"std::ios_base::Init::~Init()", referenced from 出現這樣的編譯問題,是需要再加進libstdc++.dylib和libstdc++.6.dylib(為6.1使用,xcode5以後預設complier也可以編譯通過)