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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SmartSql 动态代理仓储

發布時間:2023/12/4 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SmartSql 动态代理仓储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SmartSql源碼:https://github.com/Ahoo-Wang/SmartSql

1|1簡介



動態代理倉儲(SmartSql.DyRepository)組件是SmartSql非常獨特的功能,它能簡化SmartSql的使用。對業務代碼除了配置幾乎沒有侵入。可以說使用SmartSqlContainer是原始方法,而DyRepository自動幫你實現這些方法。

DyRepository的表現是只需要定義倉儲接口,通過簡單配置就能自動實現這些接口并注冊到IoC容器中,使用時注入即刻獲取實現。原理是通過接口和接口方法的命名規則來獲取SmartSql的xml文件中的Scope和SqlId,用接口方法的參數作為Request,通過xml中的sql自動判斷是查詢還是執行操作,最后實現對ISmartSqlMapper的調用。

1|2適合場景



  • 使用了倉儲模式的架構

  • 倉儲模式主要在DDD戰術中運用,用來隔離領域和數據庫。DyRepository的功能需求主要是在DDD的實踐中發現的,目前為止已經滿足DDD實踐的大部分需求,如果還有其他的相關需求歡迎提出Issue。

  • 類似SqlHepler的應用

  • DyRepository可以將任意一個接口實現出查詢數據庫的工具,CURD方法不在話下。通過接口注入更能發揮解耦的作用。

    1|3使用介紹



    下面會簡單演示DyRepository與ISmartSqlMapper的使用對比。

    準備工作

  • 先創建一個倉儲,這個倉儲不依賴SmartSql,只是普普通通的倉儲接口

  • 創建配置xml文件SmartSqlMapConfig.xml:

  • 再創建xml配置文件Activity.xml,放到Maps目錄,并且在屬性面板設置為“始終復制”:

  • 準備工作完成,下面就可以展示兩種用法的區別。

    兩種用法

    ISmartSqlMapper 用法

    如果不用DyRepository,我們需要用ISmartSqlMapper實現這個倉儲。

    再把實現類注冊到IoC中:Dp

    y

    如果使用DyRepository,我們只需配置一下IoC注冊即可。

    注入使用

    使用方法就注入接口,再調用接口方法了。

    1|4總結



    通過DyRepository與ISmartSqlMapper的簡單對比,我們就可以看出DyRepository的強大,為我們省下了很多代碼。當然,ISmartSqlMapper自然也有它的靈活性,能夠在任何地方使用。但是如果沒有其他的特殊需求,在架構方面,因為對業務代碼幾乎無侵入,DyRepository無疑是最推薦的使用方式。

    本文只介紹了DyRepository默認約定的使用方法,其實它還能通過各種配置項去實現更靈活的功能。詳情請看下一節《DyRepository配置》。

    2|0DyRepository配置



    DyRepository的配置分為默認配置、特性配置和注冊配置,但是都必須配置IoC注冊,因為要都需要創建動態的接口實現到IoC中。

    2|1必須的配置:



  • 單個注冊

  • ? ?services.AddRepository<IUserRepository>();
  • 批量注冊

  • 2|2可選配置

    特性配置指在接口上標注特性來配置DyRepository的配置項,而注冊配置是指在IoC注冊方法中配置,下面演示一下兩者的不同。

    Scope配置

    場景

    I{Scope}Repository是默認配置的Scope模版,如IUserRepository的Scope就是User。如果是這樣的接口命名風格則無需再配置。
    而當需要換接口命名風格,如查詢User的Dao層名稱是IUserDao,則需要配置對應的Scope。

    特性配置

    ? ?[SqlMap(Scope = "User")] ? ?
    ? ?public interface IUserDao{}

    注冊配置


    的,只要被掃描到的接口不同,就可以給不同的接口配置不同的屬性

    SqlId配置

    SqlId默認是取倉儲接口的方法名,只要方法名跟xml中的SqlId一樣,則無需任何配置。

    場景

    因為SmartSql的sql配置是可以動態渲染的,當同一個SqlId傳入不同的參數,可以渲染出不同的查詢條件。例如:

    此時如果只用默認配置,寫兩個Query(string)方法就會有同方法名同參數類型而無法重載的問題。因此,此時需要接口方法名不同,而通過配置去指定相同的SqlId。

    特性配置

    注冊配置


    冊配置中是通過配置一個叫sqlIdNamingConvert的委托參數來實現接口方法名到SqlId的轉換方法。

    需要注意的是,這個配置需要把AddSmartSqlRepositoryFactory和AddRepositoryFromAssembly兩個方法分開,原因是前幾個配置中的AddSmartSqlRepositoryFromAssembly方法內部調用過AddSmartSqlRepositoryFactory,如果再次調用會造成沖突。

    其它配置

    場景

    如果希望SmartSql只做接口實現而不侵入接口,以上的注冊配置基本就能滿足大部分需求。

    但是如果需要深入使用SmartSql,那么利用特性配置和一個泛型接口能得到更多額外的功能。

    接口方法指定Sql

    即直接給接口方法綁定sql,無需再從xml中配置sql了,但請注意參數前綴還是需要在對應的配置文件配置。

    即把接口方法的參數值傳遞給Sql渲染時指定參數名的參數,例如把id的值傳遞給@UserId:

    繼承泛型接口之后,能夠直接調用它里面的CURD通用方法。

  • 同步調用:IRepository<TEntity, TPrimary>

  • 異步調用:IRepositoryAsync<TEntity, TPrimary>


  • 相關文章:

    • 如何通過本地化事件正確實現微服務內部強一致性,事件總線跨微服務間最終一致性

    • SmartCode 正式開源,不只是代碼生成器!

    • SmartSql For Asp.Net Core 最佳實踐

    原文地址:https://www.cnblogs.com/ElderJames/p/9670296.html

    .NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

    總結

    以上是生活随笔為你收集整理的SmartSql 动态代理仓储的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。