1. 程式人生 > >Nop Commerce3.1 中新增一個Domain Model 最詳細程式碼及解釋

Nop Commerce3.1 中新增一個Domain Model 最詳細程式碼及解釋

先貼上轉來的步驟:

在NopCommerce中新增一個Domain Model,需要以下幾個步驟:

1. 新建一個Entity Class (Nop/Core/Domain/Entity.cs)

2. 新建一個Mapping Class (Nop/Data/Mapping/EntityMap.cs)

3. 新建一個View Model (Nop/Admin/Models/EntityModel.cs 或 Nop/Web/Models/EntityModel.cs)

4. 新建Model Validator (Nop/Admin/Validators/EntityValidator.cs 或 Nop/Web/Validators/EntityValidator.cs)

5. 為AutoMapper新建對映配置,用來完成Model和Entity之間的轉換 (Nop/Admin/Infrastructure/AutoMapperStartupTask.cs 或 Nop/Web/Infrastructure/AutoMapperStartupTask.cs)

6. 編寫ToModel和ToEntity (Nop/Admin/MappingExtensions.cs 或 Nop/Web/MappingExtensions.cs)

7. 建立Service和Service Interface (Nop/Services/EntityService.cs 和 Nop/Services/IEntityService.cs)

8. 最後新建的Model建立Controller和View

PS: NopCommerce不支援database migration,需要手動更新資料庫。

其中,5,6步驟採用另一種方式 即不用autoMapper 而是在controller中手動寫(我就是這麼做的,雖然繁瑣了些,但剛開始研究nop,踏實,且實現結果一樣)

重:除了上面幾步,還有非常重要的一步:即:在nop.Web.Framework中進行Service的註冊。

最後我們達到的結果如下:(僅展示後臺,前臺邏輯相同)



下面我一步一步結合程式碼講述:

1.Entity class: Nop.Core.Domian/Jingdian/JingdianSpot.cs

即資料庫實體類,屬性和資料庫表裡是一樣的,如果繼承BaseEntity,則不用額外寫Id這個屬性了:

namespace Nop.Core.Domain.Jingdian
{

    public partial class JingdianSpot:BaseEntity
    {
             
        public string title { get; set; }
        
        public string tbimg { get; set; }
        
        public string ch { get; set; }
        
        public double x { get; set; }
        
        public double y { get; set; }
        
        public string intro { get; set; }
        
        public double runtime { get; set; }
        
        public string start_time { get; set; }
        
        public string address { get; set; }
    }
}

2.既然實體類寫好了,就順便把資料庫建了,別忘了標識主鍵為true,即自增:

3.Nop.Data.Mapping/Jingdian/JingdianSpotMap.cs

這裡作entity到資料庫表的對映,表明和資料庫裡的表名一致就行了

namespace Nop.Data.Mapping.Jingdian
{
    public partial class JingdianSpotMap : EntityTypeConfiguration<JingdianSpot>
    {
        public JingdianSpotMap()
        {
            this.ToTable("JingdianSpot");
            this.HasKey(pr=>pr.Id);
        }
    }
}

4. Nop.Services/Jingdian/IJingdianService和JingdianService:它們是資料庫相關操作的類,

其中JingdianService 用到了IRepository, IRespository和EfRespository中的方法是可以擴充套件的,像我後來就寫了一個獲取剛插入資料庫後Id的方法

IJingdianService.cs:

namespace Nop.Services.Jingdian
{
    public partial interface IJingdianService
    {

        JingdianSpot GetJingdianById(int jingdianId);
         
        void DeleteJingdian(JingdianSpot jingdianSpot);

        IPagedList<JingdianSpot> GetAllJingdian(int pageIndex, int pageSize, bool showHidden = false);

        List<JingdianSpot> GetAllJingdian();

        List<JingdianSpot> GetJingdianBych(string ch);

        void InsertJingdian(JingdianSpot jingdian);

        void UpdateJingdian(JingdianSpot jingdian);
    }
}

JingdianService.cs:

namespace Nop.Services.Jingdian
{
    public partial class JingdianService : IJingdianService
    {
        #region Fields

        private readonly IRepository<JingdianSpot> _JingdianSpotRepository;
        private readonly IEventPublisher _eventPublisher;

        #endregion

        #region Ctor

        public JingdianService(IRepository<JingdianSpot> JingdianSpotRepository,
            IEventPublisher eventPublisher)
        {
            this._JingdianSpotRepository = JingdianSpotRepository;
            this._eventPublisher = eventPublisher;
        }

        #endregion

        #region Methods

        
        public virtual JingdianSpot GetJingdianById(int JingdianId)
        {
            if (JingdianId == 0)
                return null;

            return _JingdianSpotRepository.GetById(JingdianId);
        }


        public virtual void DeleteJingdian(JingdianSpot JingdianSpot)
        {
            if (JingdianSpot == null)
                throw new ArgumentNullException("newsItem");

            _JingdianSpotRepository.Delete(JingdianSpot);
            //event notification
            _eventPublisher.EntityDeleted(JingdianSpot);
        }



        public virtual IPagedList<JingdianSpot> GetAllJingdian(int pageIndex, int pageSize, bool showHidden = false)
        {
            var query = _JingdianSpotRepository.Table;
            query = query.OrderByDescending(a => a.Id);

            var Jingdian = new PagedList<JingdianSpot>(query, pageIndex, pageSize);
            return Jingdian;
        }

        public virtual List<JingdianSpot> GetAllJingdian()
        {
            var query = _JingdianSpotRepository.Table;
                query = query.OrderBy(a=>a.Id);

               /* var query = from c in _blogCommentRepository.Table
                            orderby c.CreatedOnUtc
                            where (customerId == 0 || c.CustomerId == customerId)
                            select c;
                */
                var content = query.ToList();
                return content;
        }

        public virtual List<JingdianSpot> GetJingdianBych(string ch)
        {
            var query = from c in _JingdianSpotRepository.Table
                        orderby c.Id
                        where (c.ch == ch)
                        select c;
            var content = query.ToList();
            return content;
        }

        public virtual void InsertJingdian(JingdianSpot Jingdian)
        {
            if (Jingdian == null)
                throw new ArgumentNullException("news");

            _JingdianSpotRepository.Insert(Jingdian);

            //event notification
            _eventPublisher.EntityInserted(Jingdian);
        }


        public virtual void UpdateJingdian(JingdianSpot Jingdian)
        {
            if (Jingdian == null)
                throw new ArgumentNullException("news");

            _JingdianSpotRepository.Update(Jingdian);

            //event notification
            _eventPublisher.EntityUpdated(Jingdian);
        }

        #endregion

    }

5.Nop.Admin.Models/Jingdian/JingdianSpotModel.cs

這是View model, 即顯示到頁面上的屬性都有哪些

namespace Nop.Admin.Models.Jingdian
{
    
    public partial class JingdianSpotModel : BaseNopEntityModel
    {
        [NopResourceDisplayName("Admin.Jingdian.Fields.title")]
        public string title { get; set; }

        [NopResourceDisplayName("Admin.Jingdian.Fields.tbimg")]
        public string tbimg { get; set; }

        [NopResourceDisplayName("Admin.Jingdian.Fields.ch")]
        public string ch { get; set; }

        [NopResourceDisplayName("Admin.Jingdian.Fields.x")]
        public double x { get; set; }

        [NopResourceDisplayName("Admin.Jingdian.Fields.y")]
        public double y { get; set; }

        [NopResourceDisplayName("Admin.Jingdian.Fields.intro")]
        public string intro { get; set; }

        [NopResourceDisplayName("Admin.Jingdian.Fields.runtime")]
        public double runtime { get; set; }

        [NopResourceDisplayName("Admin.Jingdian.Fields.start_time")]
        public string start_time { get; set; }

        [NopResourceDisplayName("Admin.Jingdian.Fields.address")]
        public string address { get; set; }

    }

6. Nop.Admin.Validators/Jingdian/JingdianSpotValidators.cs

驗證類:

namespace Nop.Admin.Validators.Jingdian
{
    public class JingdianSpotValidator:AbstractValidator<JingdianSpotModel>
    {
        public JingdianSpotValidator(ILocalizationService localizationService)
        {
            RuleFor(x => x.title)
                .NotNull()
                .WithMessage(localizationService.GetResource("Admin.ContentManagement.News.NewsItems.Fields.Title.Required"));

            RuleFor(x => x.tbimg)
                .NotNull()
                .WithMessage(localizationService.GetResource("Admin.ContentManagement.News.NewsItems.Fields.Short.Required"));
            RuleFor(x => x.intro)
                .NotNull()
                .WithMessage(localizationService.GetResource("Admin.ContentManagement.News.NewsItems.Fields.Full.Required"));
        }   
    }
}

7. Nop.Admin.Infrastructure/AutoMapperStartupTask.cs:

作entity和model之間的對映,可以設定相關條件進行對映限制

 //Jingdian
            Mapper.CreateMap<JingdianSpot, JingdianSpotModel>();
            Mapper.CreateMap<JingdianSpotModel, JingdianSpot>();

8.Nop.Admin/MappingExtensions.cs

  #region Jingdian
        //JingdianSpot
        public static JingdianSpotModel ToModel(this JingdianSpot entity)
        {
            return Mapper.Map<JingdianSpot, JingdianSpotModel>(entity);
        }

        public static JingdianSpot ToEntity(this JingdianSpotModel model)
        {
            return Mapper.Map<JingdianSpotModel, JingdianSpot>(model);
        }

        public static JingdianSpot ToEntity(this JingdianSpotModel model, JingdianSpot destination)
        {
            return Mapper.Map(model, destination);
        }

        #endregion

9. Nop.Web.FrameWork/ DependencyRegistrar.cs:

builder.RegisterType<JingdianService>().As<IJingdianService>().InstancePerHttpRequest();

10.自己寫controller和View (隨附件程式碼奉上)

注:若想改變後臺選單,在Nop.Admin:sitemap.config可以改變。

附件:上述各檔案程式碼含:controller和View的程式碼:

http://www.t00y.com/file/44306373

相關推薦

Nop Commerce3.1 新增一個Domain Model 詳細程式碼解釋

先貼上轉來的步驟: 在NopCommerce中新增一個Domain Model,需要以下幾個步驟: 1. 新建一個Entity Class (Nop/Core/Domain/Entity.cs) 2. 新建一個Mapping Class (Nop/Data/Mapping

Java List新增一個物件多次

在實際應用場景中,可以需要在一個List中新增多個物件,在使用的時候有個誤區就是將一個物件新增多次到List中,導致資料不一致。 測試程式碼: public class test { public static void main(String[] args) {

使用gevent.monkey.patch_all() 協程池遇到阻塞,在任務新增一個sleep()搞定~

關於使用gevent.monkey.patch_all()協程池遇到阻塞解決辦法: import time ... class Example: ... time.sleep(0.000001) 在進行多執行緒時monkey會阻塞住執行緒的繼續執行,需要對monkey.p

webgl新增一個div框實現框選

在webgl的開發中,新增一個div,可以實現框選的樣式。過程很簡單,直接看程式碼吧,這裡主要實現了點選第一次的時候確定div的位置,第二次實時顯示div的大小及樣式。這裡為了顯示實在canvas上畫div,將canvas設定為紅色。 <!DOCTYPE HTML PUBLIC "-//

向陣列新增一個元素

實現效果:    知識運用:   Array物件的Length屬性 int類的tryParse()方法 實現程式碼: int[] int_arr; //"隨機陣列"按鈕事件 private void button1_Click(object se

CentOS 7新增一個新使用者並授權

CentOS 7中新增一個新使用者並授權 [日期:2016-11-26] 來源:Linux社群  作者:woshimrf [字型:大 中 小]     前言 筆記本安裝了一個CentOS,

在asp.net core2.1新增中介軟體以擴充套件Swashbuckle.AspNetCore3.0支援簡單的文件訪問許可權控制

Swashbuckle.AspNetCore3.0 介紹 一個使用 ASP.NET Core 構建的 API 的 Swagger 工具。直接從您的路由,控制器和模型生成漂亮的 API 文件,包括用於探索和測試操作的 UI。 專案主頁:https://github.com/domaindrivendev/Sw

如何在mfc對話方塊新增一個顯示網頁的視窗

這個要用到 ActiveX 控制元件了,向對話方塊裡面插入一個 WebBrowser控制元件,之後使用就可以了!=============================利用WebBrowser控制元件建立自己的瀏覽器①新建一個基於對話方塊的工程,命名為test,然後在對話方塊上單擊右鍵,選擇Insert A

在DataGrid新增一個合計欄位

上面所用到的螢幕圖片中的 DataGrid 是一個非常典型的 DataGrid 。有許多控制 DataGrid 外觀的屬性,它使用兩個 BoundColumns 來操作資料,但這並不是最重要的。做好這項工作真正重要的是使用 DataGrid.OnItemDataBound 事

集合框架(一)續 向集合新增一個集合、陣列和List之間的相互轉換、從集合刪除另一個集合所包含的元素

集合方法集結: import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedList; import java.util.List

7.2在框架新增一個面板,背景色設為黃色,在面板新增兩個按鈕。

摩爾的Java學習筆記7.2 第七週作業: 1、在視窗(寬300,高200)中新增一個面板,面板的背景色為綠色,視窗在螢幕中央,不允許改變其大小,關閉視窗時程式結束執行; 2、在

向config.xml新增一個配置項

1. 在config.xml中新增一項(路徑:frameworks/base/core/res/res/values/) 如: <bool name="config_myValue">true</bool> 2. 在 frameworks/base/

[Linux學習--使用者管理]centos新增一個新使用者,並授權

前言 有時候給root使用者不太方便,新建一個用於並賦予許可權這個做法相對好些 建立新使用者 建立一個使用者名稱為:cmj [[email protected] ~]# adduser cmj 為這個使用者初始化密碼,linux會判斷密碼複雜度,不過可以

jacob學習一:向word新增一個字串

最近發現許多操作都是需要呼叫windows的COM元件,雖然java有JNI,但是似乎並不好用,後來發現有個jacob,底層雖然也是使用JNI,但是直接使用jacob,好了很多,,下面是一個簡單的demo; 主要實現開啟一個臨時word,填寫一個字串。 /*********

在centos7新增一個新使用者,並授權

前言 筆記本裝了一個centos,想要讓別人也可以登入訪問,用自己的賬號確實不太好,於是準備新建一個使用者給他。 建立新使用者 建立一個使用者名稱為:zhangbiao [[email protected] ~]# adduser zhangbiao

Spring Security在標準登入表單新增一個額外的欄位

概述 在本文中,我們將通過向標準登入表單新增額外欄位來實現Spring Security的自定義身份驗證方案。 我們將重點關注兩種不同的方法,以展示框架的多功能性以及我們可以使用它的靈活方式。 我們的第一種方法是一個簡單的解決方案,專注於重用現有的核心Spring Security實現。 我們的第二種方法是更

python在elasticsearch7.1.1建立一個索引type並將CVS檔案批量匯入

#coding=utf-8 from elasticsearch import Elasticsearch from elas

如何在ubuntu一個簡單的C語言程式碼並編譯執行

首先需要安裝一個編譯器 因為筆者也是剛剛開始學習ubuntu所以不知道各個編譯器之間的區別,筆者所用的是gcc就簡單介紹一下gcc的安裝方法吧。 方法一: 開啟控制檯輸入以下程式碼: sudo apt-get build-dep gcc; sudo apt-get bui

VC6.0 新增/取消 塊註釋的Macro程式碼

SAMPLE.DSM是微軟提供的樣例,使用的是vb語言。其中的 CommentOut 函式,是支援塊註釋的,可是這種/**/的註釋方式,有時候用起來不是很方便,因為兩個/會因為一個/而終止。對於大塊程式碼,使用//註釋,僅需修改原樣例函式中的少部分程式碼。 取消註釋的實現,可以在註釋的基礎上進行修改。兩個函式

《機器學習實戰》第2章閱讀筆記3 使用K近鄰演算法改進約會網站的配對效果—分步驟詳細講解1——資料準備:從文字檔案解析資料(附詳細程式碼註釋)

 本篇使用的資料存放在文字檔案datingTestSet2.txt中,每個樣本資料佔據一行,總共有1000行。 樣本主要包含以下3中特徵: (1)每年獲得飛行常客里程數 (2)玩視訊遊戲所耗時間百分比 (3)每週消費的冰淇淋公升數 在使用分類器之前,需要將處理的檔案格式