日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

这样设计是否更好些~仓储接口是否应该设计成基础操作接口和扩展操作接口

發(fā)布時間:2024/4/13 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这样设计是否更好些~仓储接口是否应该设计成基础操作接口和扩展操作接口 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

我們進行l(wèi)inq to sql和ef時代后,底層的實現(xiàn)基本使用的是repository模塊,即倉儲模式,事實上就是把ORM實體的最基本操作進行封閉,對外層不公開操作實現(xiàn)的細(xì)節(jié)。

面向接口的編程

一個規(guī)定,多個實現(xiàn),這可能是接口給我們帶來的最直觀的印象了,比如一個倉儲在定義后,你可以用linq to sql實現(xiàn)它,也可以用ef去實現(xiàn)它,再或者使用ado.net去實現(xiàn)它,但它對外暴露的永遠是穩(wěn)定的接口,這里我們稱為IRepository。

倉儲接口是否應(yīng)該設(shè)計成基礎(chǔ)操作接口和擴展操作接口

這是今天說的重點,我們把倉儲的最基本操作提煉出來,放到IRepository接口里,它叫做基本操作接口;將集合操作及其它附加操作放在IExtensionRepository接口里,我們稱它為擴展操作接口;而我們再建立一個完成功能的接口ICompleteRepository,它會集成前兩個接口,當(dāng)調(diào)用方要求使用IRepository和IExtensionRepository的功能時,我們必須使用ICompleteRepository去聲明對象,而簡單的操作我們只需要使用IRepository去聲明對象即可。

?IRepository接口我們可以這樣定義:

public interface IRepository<TEntity>where TEntity : class{/// <summary>/// 添加實體并提交到數(shù)據(jù)服務(wù)器/// </summary>/// <param name="item">Item to add to repository</param>void Insert(TEntity item);/// <summary>/// 移除實體并提交到數(shù)據(jù)服務(wù)器/// 如果表存在約束,需要先刪除子表信息/// </summary>/// <param name="item">Item to delete</param>void Delete(TEntity item);/// <summary>/// 修改實體并提交到數(shù)據(jù)服務(wù)器/// </summary>/// <param name="item"></param>void Update(TEntity item);/// <summary>/// Get all elements of type {T} in repository/// </summary>/// <returns>List of selected elements</returns>IQueryable<TEntity> GetModel();/// <summary>/// 根據(jù)主鍵得到實體/// </summary>/// <param name="id"></param>/// <returns></returns>TEntity Find(params object[] id);}

對于擴展的功能接口,我們可以這樣去定義:

/// <summary>/// 擴展的Repository操作規(guī)范/// </summary>public interface IExtensionRepository<TEntity> where TEntity : class{/// <summary>/// 添加集合/// </summary>/// <param name="item"></param>void Insert(IEnumerable<TEntity> item);/// <summary>/// 修改集合/// </summary>/// <param name="item"></param>void Update(IEnumerable<TEntity> item);/// <summary>/// 刪除集合/// </summary>/// <param name="item"></param>void Delete(IEnumerable<TEntity> item);/// <summary>/// 擴展更新方法,只對EF支持/// </summary>/// <param name="entity"></param>void Update(System.Linq.Expressions.Expression<Action<TEntity>> entity);/// <summary>/// 根據(jù)指定規(guī)約得到延時結(jié)果集/// </summary>/// <param name="specification"></param>/// <returns></returns>IQueryable<TEntity> GetModel(Commons.Entity.Specification.ISpecification<TEntity> specification);/// <summary>/// 根據(jù)指定lambda得到延時結(jié)果集/// </summary>/// <param name="predicate"></param>/// <returns></returns>IQueryable<TEntity> GetModel(System.Linq.Expressions.Expression<Func<TEntity, bool>> predicate);/// <summary>/// 根據(jù)指定規(guī)約得到實體/// </summary>/// <param name="specification"></param>/// <returns></returns>TEntity Find(Commons.Entity.Specification.ISpecification<TEntity> specification);/// <summary>/// 根據(jù)指定lambda得到實體/// </summary>/// <param name="predicate"></param>/// <returns></returns>TEntity Find(System.Linq.Expressions.Expression<Func<TEntity, bool>> predicate);}

而為了使業(yè)務(wù)層即有IRepository而且還有IExtensionRepository接口的功能,我們將建立一個完整操作的接口,它由倉儲實現(xiàn)基類去集成,在業(yè)務(wù)層,可以聲明

這個完整的倉儲接口:

/// <summary>/// 完整的數(shù)據(jù)操作接口/// 完整的接口中,包括兩個事件/// </summary>public interface ICompleteRepository<T> :IRepository<T>,IExtensionRepository<T>where T : class{/// <summary>/// Occurs after data saved/// </summary>event EventHandler<SavedEventArgs> AfterSaved;/// <summary>/// Occurs before data saved/// </summary>event EventHandler<SavedEventArgs> BeforeSaved;}

一個倉儲基類將去實現(xiàn)它,當(dāng)然你的倉儲基類根據(jù)ORM不同,可以會有多個版本,你可以配合IOC來動態(tài)干這件事,呵呵!

如圖:

再看一下傳統(tǒng)DAL層圖:(比較喜歡DDD架構(gòu),對于簡單業(yè)務(wù)還是可以使用這種傳統(tǒng)架構(gòu)的)

好了,今天的倉儲接口就討論到這里吧,呵呵,對于一個問題的答案,在不同的場合,環(huán)境下很可能是不同的,而我們的架構(gòu)也應(yīng)該根據(jù)不同的業(yè)務(wù)需求,靈活去應(yīng)對,這樣,才會設(shè)計出更合理的架構(gòu)!

年青人,你要敢于去創(chuàng)新!

轉(zhuǎn)載于:https://www.cnblogs.com/lori/p/3172060.html

總結(jié)

以上是生活随笔為你收集整理的这样设计是否更好些~仓储接口是否应该设计成基础操作接口和扩展操作接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。