1. 程式人生 > >開發筆記:用不用UnitOfWork以及Repository返回什麼集合型別

開發筆記:用不用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.ExtendedEF實現指定欄位的更新

今天在將一個專案中使用儲存過程的遺留程式碼遷移至新的架構時,遇到了一個問題——如何用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也可以編譯通過)