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

来源:http://www.cnblogs.com/bobositlife/archive/2017/12/14/create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-04.html
-Advertisement-
Play Games

前言 上一篇《 "一步一步創建ASP.NET MVC5程式\[Repository+Autofac+Automapper+SqlSugar\" ][1]》,我們完成了: 引用SqlSugar 使用SqlSugar對Repository類的改造 併成功使用PostRepository來查詢到了數據,今 ...


前言

上一篇《一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](三)》,我們完成了:
* 引用SqlSugar
* 使用SqlSugar對Repository類的改造
併成功使用PostRepository來查詢到了數據,今天我們來創建一個新的服務層以及安裝配置依賴註入框架組件Autofac等。

本篇知識要點

* 創建服務層:TsBlog.Services
* 創建服務介面
* 實現服務介面
* 創建倉儲介面
* 安裝Autofac依賴註入組件
* 註冊配置Autofac 依賴註入

教程內容

創建服務層

選中解決方案中的解決方案文件夾[1.Libraries],右鍵單擊=>>添加=>>新項目,在彈出的對話框中添加一個.NET Framework 4.6.2的C#類庫項目,命名為:TsBlog.Services。項目創建成功後,刪除自動生成的Class1.cs文件。

由於服務層需要依賴於倉儲層,所以首先切換到倉儲層[TsBlog.Repositories]項目中,創建博文的倉儲介面類:IPostRepository,代碼如下:

using System.Collections.Generic;
using TsBlog.Domain.Entities;

namespace TsBlog.Repositories
{
    public interface IPostRepository
    {
        /// <summary>
        /// 根據ID查詢單條數據
        /// </summary>
        /// <param name="id">ID</param>
        /// <returns></returns>
        Post FindById(int id);
        /// <summary>
        /// 查詢所有數據(無分頁,大數量時請慎用)
        /// </summary>
        /// <returns></returns>
        IEnumerable<Post> FindAll();

        /// <summary>
        /// 寫入實體數據
        /// </summary>
        /// <param name="entity">博文實體類</param>
        /// <returns></returns>
        int Insert(Post entity);

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

        /// <summary>
        /// 根據實體刪除一條數據
        /// </summary>
        /// <param name="entity">博文實體類</param>
        /// <returns></returns>
        bool Delete(Post entity);

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

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

再切換到服務層,在剛纔創建的服務層項目中首先引用倉儲層,並分別創建以下服務介面和類文件:

IPostService.cs:

using System.Collections.Generic;
using TsBlog.Domain.Entities;

namespace TsBlog.Services
{
    public interface IPostService
    {
        /// <summary>
        /// 根據ID查詢單條數據
        /// </summary>
        /// <param name="id">ID</param>
        /// <returns></returns>
        Post FindById(int id);
        /// <summary>
        /// 查詢所有數據(無分頁,大數量時請慎用)
        /// </summary>
        /// <returns></returns>
        IEnumerable<Post> FindAll();

        /// <summary>
        /// 寫入實體數據
        /// </summary>
        /// <param name="entity">博文實體類</param>
        /// <returns></returns>
        int Insert(Post entity);

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

        /// <summary>
        /// 根據實體刪除一條數據
        /// </summary>
        /// <param name="entity">博文實體類</param>
        /// <returns></returns>
        bool Delete(Post entity);

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

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

PostService.cs

using System.Collections.Generic;
using TsBlog.Domain.Entities;
using TsBlog.Repositories;

namespace TsBlog.Services
{
    public class PostService : IPostService
    {
        private readonly IPostRepository _postRepository;
        public PostService(IPostRepository postRepository)
        {
            _postRepository = postRepository;
        }
        public bool Delete(Post entity)
        {
            return _postRepository.Delete(entity);
        }

        public bool DeleteById(object id)
        {
            return _postRepository.DeleteById(id);
        }

        public bool DeleteByIds(object[] ids)
        {
            return _postRepository.DeleteByIds(ids);
        }

        public IEnumerable<Post> FindAll()
        {
            return _postRepository.FindAll();
        }

        public Post FindById(int id)
        {
            return _postRepository.FindById(id);
        }

        public int Insert(Post entity)
        {
            return _postRepository.Insert(entity);
        }

        public bool Update(Post entity)
        {
            return _postRepository.Update(entity);
        }
    }
}

最後,我們再切換到倉儲層,在PostRepository文件中使用IPostRepository介面並使用SqlSugar實現該介面中的所有數據操作的方法,
PostRepository.cs

using System.Collections.Generic;
using TsBlog.Domain.Entities;

namespace TsBlog.Repositories
{
    /// <summary>
    /// POST表的資料庫操作類
    /// </summary>
    public class PostRepository : IPostRepository
    {
        /// <summary>
        /// 根據ID查詢
        /// </summary>
        /// <param name="id">Post ID</param>
        /// <returns></returns>
        public Post FindById(int id)
        {
            using (var db = DbFactory.GetSqlSugarClient())
            {
                var entity = db.Queryable<Post>().Single(x => x.Id == id);
                return entity;
            }
        }

        /// <summary>
        /// 查詢所有數據(無分頁,大數量時請慎用)
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Post> FindAll()
        {
            #region SqlSugar讀取方式
            using (var db = DbFactory.GetSqlSugarClient())
            {
                var list = db.Queryable<Post>().ToList();
                return list;
            }
            #endregion
        }


        /// <summary>
        /// 寫入實體數據
        /// </summary>
        /// <param name="entity">博文實體類</param>
        /// <returns></returns>
        public int Insert(Post entity)
        {
            using (var db = DbFactory.GetSqlSugarClient())
            {
                var i = db.Insertable(entity).ExecuteReturnBigIdentity();
                //返回的i是long類型,這裡你可以根據你的業務需要進行處理
                return (int)i;
            }
        }

        /// <summary>
        /// 更新實體數據
        /// </summary>
        /// <param name="entity">博文實體類</param>
        /// <returns></returns>
        public bool Update(Post entity)
        {
            using (var db = DbFactory.GetSqlSugarClient())
            {
                //這種方式會以主鍵為條件
                var i = db.Updateable(entity).ExecuteCommand();
                return i > 0;
            }
        }

        /// <summary>
        /// 根據實體刪除一條數據
        /// </summary>
        /// <param name="entity">博文實體類</param>
        /// <returns></returns>
        public bool Delete(Post entity)
        {
            using (var db = DbFactory.GetSqlSugarClient())
            {
                var i = db.Deleteable(entity).ExecuteCommand();
                return i > 0;
            }
        }

        /// <summary>
        /// 刪除指定ID的數據
        /// </summary>
        /// <param name="id">主鍵ID</param>
        /// <returns></returns>
        public bool DeleteById(object id)
        {
            using (var db = DbFactory.GetSqlSugarClient())
            {
                var i = db.Deleteable<Post>(id).ExecuteCommand();
                return i > 0;
            }
        }

        /// <summary>
        /// 刪除指定ID集合的數據(批量刪除)
        /// </summary>
        /// <param name="ids">主鍵ID集合</param>
        /// <returns></returns>
        public bool DeleteByIds(object[] ids)
        {
            using (var db = DbFactory.GetSqlSugarClient())
            {
                var i = db.Deleteable<Post>().In(ids).ExecuteCommand();
                return i > 0;
            }
        }
    }
}

到這裡,我們的倉儲和服務層準備工作就完成了,接下來安裝依賴註入組件:Autofac

安裝Autofac

選擇解決方案夾[2.Persentation]中的Web項目[TsBlog.Frontend],在"引用"("References")上單擊右鍵,調出Nuget程式包管理界面,搜索"autofac",如下:

Nuget程式包管理--安裝Autofac

Autofac的當前版本為:v4.6.2

同時,再搜索"Autofac.Mvc5",如下:

Nuget程式包管理--安裝Autofac.Mvc5

配置/註冊依賴選項

Autofac安裝完成之後,我們需要對依賴的介面對實現在Autofac中進行註冊,本示例的Autofac配置在Global.asax文件中(請確保TsBlog.Frontend項目中引用了:TsBlog.Domain,TsBlog.Repositories,TsBlog.Servcies這本個項目),如下:

Global.asax

using Autofac;
using Autofac.Integration.Mvc;
using System.Web.Mvc;
using System.Web.Routing;
using TsBlog.Repositories;
using TsBlog.Services;

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();
        }

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

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

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

            //註冊過濾器
            builder.RegisterFilterProvider();

            var container = builder.Build();

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

然後,我們修改控制器文件夾中的HomeController,修改後的代碼如下:

HomeController.cs

using System.Web.Mvc;
using TsBlog.Services;

namespace TsBlog.Frontend.Controllers
{
    public class HomeController : Controller
    {
        private readonly IPostService _postService;
        public HomeController(IPostService postService)
        {
            _postService = postService;
        }
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Post()
        {
            //var postRepository = new PostRepository();
            //var post = postRepository.FindById(1);
            //return View(post);

            var post = _postService.FindById(1);
            return View(post);
        }
    }
}

再次按F5運行,打開頁面:http://localhost:54739/home/post,這次我們可以看到和前兩篇一樣的運行效果了

Autofac運行結果

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

本文學習到此結束,本系列未完待續......

如果你喜歡Rector的本系列文章,請為我點個大大的贊,以支持Rector在後續的寫作中更有基(激)情,哈哈。。。

本文同步發表至 圖享網一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar](四)


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

-Advertisement-
Play Games
更多相關文章
  • 第一步: 創建一個SpringBoot應用 第二步: 創建一個實體,用來存儲數據,在src/main/java/com/example/first下創建包entity , 在entity下創建Person.java文件 第三步: 創建resource, 在src/main/java/com/exam ...
  • 前言 在golang中,只需要在函數調用前加上關鍵字go即可創建一個併發任務單元,而這個新建的任務會被放入隊列中,等待調度器安排。相比系統的MB級別線程棧,goroutine的自定義棧只有2KB,這使得我們能夠輕易創建上萬個併發任務,如此對性能提升不少。但隨之而來的有以下幾個問題: "如何等待所有g ...
  • 第一篇... List列表 ...
  • 在web.config中的system.web 節點下添加如下代碼: ...
  • 當我們在VS的C++中使用vector、list、map等這些STL容器,在開啟調試的時候可以看到這樣的信息: 然而在我們自己手寫鏈表,調試的時候卻要像這樣一級一級展開,很是麻煩。 有時候會想,如果要能像STL裡面的list那樣子直接顯示出來就方便許多。經過幾番尋找,終於被我找到了方法。 使用 .n ...
  • 開源bitcms內容管理系統,經過幾個版本的更新和客戶的使用已經基本上完善了。採用Entity Framework 6 + MVC5開發。資料庫由原來的Sqlite升級為mysql,主要考慮系統要適用中小型系統。 ...
  • 1.首先創見Core控制台應用程式 並且引入 AspNetCore.All 首先我們寫入配置信息:直接代碼如下 接下來是讀取 我們上面寫入的配置信息 //GetSection 讀取對象類型的配置信息 Bind 綁定信息 var user = new User(); Console.WriteLine ...
  • 一些小的C/S項目(winform、WPF等),因需要訪問操作資料庫,但又不能把DB連接配置在客戶端上,原因有很多,可能是DB連接無法直接訪問,或客戶端不想安裝各種DB訪問組件,或DB連接不想暴露在客戶端(即使加密連接字元串仍有可能被破解的情況),總之都是出於安全考慮,同時因項目小,也無需採用分散式 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...