一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](七)

来源:https://www.cnblogs.com/bobositlife/archive/2018/01/29/create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-07.html
-Advertisement-
Play Games

前言 大家好,我依舊是你們的老朋友Rector,很高興又在周五的時候準時和大家見面。 Rector的系列文章【一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar]】從寫作以來,已經出了六期了,其中受到了很多朋友的喜歡,在此非常感謝大 ...


前言

大家好,我依舊是你們的老朋友Rector,很高興又在周五的時候準時和大家見面。

Rector的系列文章【一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar]】從寫作以來,已經出了六期了,其中受到了很多朋友的喜歡,在此非常感謝大家對Rector的支持,也希望Rector的文章可以幫助大家(特別是才接觸或者是對.NET/C#高級編程比較薄弱的朋友們)在.NET/C#的開發之旅中更快地提升自己的開發技巧和經驗。

上一篇《一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](六)》我們對TsBlog應用程式的倉儲層進行了一次重大的重構,即:使用泛型倉儲將通用的資料庫操作進行了封裝,讓我們在創建倉儲層介面和實現的時候能精簡重覆的代碼,今天要給大家分享的是對服務層的泛型封裝和重構,實現原理大致與倉儲層相似。

本文知識要點

  • 泛型服務層的封裝與重構

重構服務層

提取泛型服務基類

打開項目【TsBlog.Services】,創建 服務層通用介面類 IService.cs,在其中創建服務層通用的介面方法,如下:

using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace TsBlog.Services
{
    /// <summary>
    /// 服務介面
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IService<T>
    {
        /// <summary>
        /// 根據主值查詢單條數據
        /// </summary>
        /// <param name="pkValue">主鍵值</param>
        /// <returns>泛型實體</returns>
        T FindById(object pkValue);

        /// <summary>
        /// 查詢所有數據(無分頁,請慎用)
        /// </summary>
        /// <returns></returns>
        IEnumerable<T> FindAll();

        /// <summary>
        /// 根據條件查詢數據
        /// </summary>
        /// <param name="predicate">條件表達式樹</param>
        /// <param name="orderBy">排序</param>
        /// <returns>泛型實體集合</returns>
        IEnumerable<T> FindListByClause(Expression<Func<T, bool>> predicate, string orderBy);

        /// <summary>
        /// 根據條件查詢數據
        /// </summary>
        /// <param name="predicate">條件表達式樹</param>
        /// <returns></returns>
        T FindByClause(Expression<Func<T, bool>> predicate);

        /// <summary>
        /// 寫入實體數據
        /// </summary>
        /// <param name="entity">實體類</param>
        /// <returns></returns>
        long Insert(T entity);

        /// <summary>
        /// 更新實體數據
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        bool Update(T entity);

        /// <summary>
        /// 刪除數據
        /// </summary>
        /// <param name="entity">實體類</param>
        /// <returns></returns>
        bool Delete(T entity);

        /// <summary>
        /// 刪除數據
        /// </summary>
        /// <param name="where">過濾條件</param>
        /// <returns></returns>
        bool Delete(Expression<Func<T, bool>> @where);

        /// <summary>
        /// 刪除指定ID的數據
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        bool DeleteById(object id);

        /// <summary>
        /// 刪除指定ID集合的數據(批量刪除)
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        bool DeleteByIds(object[] ids);
    }
}

再創建 泛型基類 GenericService.cs,在其中創建服務層通用的方法,如下:

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using TsBlog.Repositories;

namespace TsBlog.Services
{
    public abstract class GenericService<T> : IService<T>, IDependency where T : class, new()
    {
        private readonly IRepository<T> _repository;

        protected GenericService(IRepository<T> repository)
        {
            _repository = repository;
        }

        /// <summary>
        /// 根據主值查詢單條數據
        /// </summary>
        /// <param name="pkValue">主鍵值</param>
        /// <returns>泛型實體</returns>
        public T FindById(object pkValue)
        {
            return _repository.FindById(pkValue);
        }

        /// <summary>
        /// 查詢所有數據(無分頁,請慎用)
        /// </summary>
        /// <returns></returns>
        public IEnumerable<T> FindAll()
        {
            return _repository.FindAll();
        }

        /// <summary>
        /// 根據條件查詢數據
        /// </summary>
        /// <param name="predicate">條件表達式樹</param>
        /// <param name="orderBy">排序</param>
        /// <returns>泛型實體集合</returns>
        public IEnumerable<T> FindListByClause(Expression<Func<T, bool>> predicate, string orderBy)
        {
            return _repository.FindListByClause(predicate, orderBy);
        }

        /// <summary>
        /// 根據條件查詢數據
        /// </summary>
        /// <param name="predicate">條件表達式樹</param>
        /// <returns></returns>
        public T FindByClause(Expression<Func<T, bool>> predicate)
        {
            return _repository.FindByClause(predicate);
        }

        /// <summary>
        /// 寫入實體數據
        /// </summary>
        /// <param name="entity">實體類</param>
        /// <returns></returns>
        public long Insert(T entity)
        {
            return _repository.Insert(entity);
        }

        /// <summary>
        /// 更新實體數據
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public bool Update(T entity)
        {
            return _repository.Update(entity);  
        }

        /// <summary>
        /// 刪除數據
        /// </summary>
        /// <param name="entity">實體類</param>
        /// <returns></returns>
        public bool Delete(T entity)
        {
            return _repository.Delete(entity);
        }

        /// <summary>
        /// 刪除數據
        /// </summary>
        /// <param name="where">過濾條件</param>
        /// <returns></returns>
        public bool Delete(Expression<Func<T, bool>> @where)
        {
            return _repository.Delete(@where);
        }

        /// <summary>
        /// 刪除指定ID的數據
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool DeleteById(object id)
        {
            return _repository.DeleteById(id);
        }

        /// <summary>
        /// 刪除指定ID集合的數據(批量刪除)
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        public bool DeleteByIds(object[] ids)
        {
            return _repository.DeleteByIds(ids);
        }

    }
}

精簡並修改 IPostService.cs

using TsBlog.Domain.Entities;
using TsBlog.Repositories;

namespace TsBlog.Services
{
    public interface IPostService : IDependency, IService<Post>
    {

    }
}

再精簡並修改 PostService.cs

using TsBlog.Domain.Entities;
using TsBlog.Repositories;

namespace TsBlog.Services
{
    public class PostService : GenericService<Post>, IPostService
    {
        private readonly IPostRepository _repository;
        public PostService(IPostRepository repository) : base(repository)
        {
            _repository = repository;
        }
    }
}

重新編譯並按F5運行 【TsBlog.Frontend】Web應用程式,你會看到如下的錯誤提示:

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-07-01.png

這是為什麼呢?是因為我們之前寫好的 PostRepository.cs類中沒有繼承IPostRepository介面,但我們在 PostService.cs 類中使用了非泛型的 IPostRepository介面,所以在 PostRepository.cs 類中添加 IPostRepository 的介面,此時的 PostRepository.cs

using TsBlog.Domain.Entities;

namespace TsBlog.Repositories
{
    /// <summary>
    /// POST表的資料庫操作類
    /// </summary>
    public class PostRepository : GenericRepository<Post>, IPostRepository
    {

    }
}

最終的 Global.asax.cs :

using Autofac;
using Autofac.Features.ResolveAnything;
using Autofac.Integration.Mvc;
using System;
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
using TsBlog.AutoMapperConfig;
using TsBlog.Repositories;

namespace TsBlog.Frontend
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            //BundleConfig.RegisterBundles(BundleTable.Bundles);

            AutofacRegister();

            AutoMapperRegister();
        }

        private void AutofacRegister()
        {
            var builder = new ContainerBuilder();

            //註冊MvcApplication程式集中所有的控制器
            builder.RegisterControllers(typeof(MvcApplication).Assembly);

            //註冊倉儲層服務
            //builder.RegisterType<PostRepository>().As<IPostRepository>();
            //註冊基於介面約束的實體
            var assembly = AppDomain.CurrentDomain.GetAssemblies();
            builder.RegisterAssemblyTypes(assembly)
                .Where(
                    t => t.GetInterfaces()
                        .Any(i => i.IsAssignableFrom(typeof(IDependency)))
                )
                .AsImplementedInterfaces()
                .InstancePerDependency();
            //builder.RegisterGeneric(typeof(GenericRepository<>))
            //    .As(typeof(IRepository<>));
            //builder.RegisterGeneric(typeof(GenericService<>))
            //    .As(typeof(IService<>));

            //builder.RegisterGeneric(typeof(GenericRepository<>));
            //builder.RegisterGeneric(typeof(GenericService<>));

            //註冊服務層服務
            //builder.RegisterType<PostService>().As<IPostService>();

            //註冊過濾器
            builder.RegisterFilterProvider();
            builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
            var container = builder.Build();

            //設置依賴註入解析器
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        }

        /// <summary>
        /// AutoMapper的配置初始化
        /// </summary>
        private void AutoMapperRegister()
        {
            new AutoMapperStartupTask().Execute();
        }
    }
}

再次按F5運行,打開頁面[http://localhost:54739/home/post ],頁面又回來了,哈哈。。。

本文的源碼托管地址:https://github.com/lampo1024/TsBlog/releases/tag/v1.7.1

本文學習到此結束,本系列未完待續,我們下期再見……

如果你喜歡Rector的本系列文章,請為我點個大大的贊。

如果遇到問題,歡迎加入圖享網官方QQ群:483350228

本文來源 圖享網一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](七)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 數組對象創建數組import numpy as npa = np.arange(10)b = np.arange(2,10,1) #[2,10)步長為1c = np.linspace(0,10,20) #[0,10]共20個d = np.array([range(5)]) #用list/tupl... ...
  • 1、對MVC的認識 1、啟動項在Global.asax.cs文件中,RouteConfig.RegisterRoutes(RouteTable.Routes);定義路由事件,可以設置啟動項; 2、Views/Home/Index.cshtml文件是頁面內容,在@....@中直接寫C#語句。該頁面可以 ...
  • 【卷土重來之C#學習筆記】(一)c#文章導航目錄 【卷土重來之C#學習筆記】(二)c#編程概述 【卷土重來之C#學習筆記】(三)類型、存儲、對象 【卷土重來之C#學習筆記】(四)類的基本概念 【卷土重來之C#學習筆記】(五)方法 【卷土重來之C#學習筆記】(六)深入理解類 【卷土重來之C#學習筆記】 ...
  • 以下內容轉自CSDN的一篇博客: 對於asp.net,預設只允許上傳4M文件,增加如下配置,一般可以自定義最大文件大小. <httpRuntime executionTimeout="800" maxRequestLength="40960" useFullyQualifiedRedirectUrl ...
  • List.Add添加的到底是什麼?。。。其實回頭想想,這不就是我們初學面向對象語言時經常遇到的,對於一個函數形參的指針傳遞與值傳遞問題嗎? ...
  • suging 的註冊中心支持consul跟zookeeper。因為consul跟zookeeper的配置都差不多,所以只是consul的配置 consul下載地址:https://www.consul.io/downloads.html consul agent 命令的常用選項,如下: -data- ...
  • 制定了一個通訊協議,然後其數據部分有如下格式。 第三列代表的是位元組數,第4列是數據類型。 當傳輸或者收到一個byte數組的時候(下麵Hex數據),按照對應格式進行解析,解析方法有很多種,網上看到了一種方式是以結構體的方式來解析的,類似C/C++方式。 Hex數據:01 01 00 00 10 44 ...
  • 需求描述 項目中有一個通知公告的功能,在後臺管理員添加公告後需要推送消息給所有註冊用戶,讓其查看消息。消息推送移動端採用極光推送,但是消息在何時發送是個問題,比如說有一個重要的會議通知,可能希望在會議開始前半天進行提醒,僅僅使用後臺代碼處理起來可能比較麻煩,這時就需要考慮到使用作業來處理這種定時執行... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...