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)每週消費的冰淇淋公升數 在使用分類器之前,需要將處理的檔案格式