版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
nopCommerce的源代碼結(jié)構(gòu)和架構(gòu)編寫(xiě)本文檔是為了向程序員說(shuō)明nopcommerce的解決方案結(jié)構(gòu),亦是程序員開(kāi)發(fā)nopcommerce的居家必備良書(shū)。首先nopcommerce的源代碼很容易拿到,它是開(kāi)源的,所以你可以直接到網(wǎng)上下載。在你打開(kāi)VS以后項(xiàng)目和文件夾都會(huì)完整列出來(lái),我們建議你在看此文檔的同時(shí)也打開(kāi)你的VS來(lái)瀏覽項(xiàng)目和文件。
絕大多數(shù)的項(xiàng)目,目錄和文件都顧名思義,你可以從名字就大概知道是做什么的。比如Nop.Plugin.Payments.PayPalStandard這個(gè)我都不用看項(xiàng)目代碼就能猜到做什么的。
\Libraries\Nop.Core
Nop.Core項(xiàng)目包含nopcommerce的一系列核心類如緩存,事件,輔助類和業(yè)務(wù)對(duì)象(如訂單和客戶實(shí)體類)
\Libraries\Nop.Data
Nop.Data項(xiàng)目包含一系列的數(shù)據(jù)訪問(wèn)類和方法以從數(shù)據(jù)庫(kù)或其他數(shù)據(jù)媒介讀取和保存數(shù)據(jù)。它也有助于把數(shù)據(jù)訪問(wèn)邏輯和你的業(yè)務(wù)對(duì)象分離。nopcommerce使用EntityFramework(EF)Code-First方法,允許你在nopcommerce代碼中定義實(shí)體(所有的核心實(shí)體類都在Nop.Core中定義),再讓EF生成數(shù)據(jù)庫(kù),這就是為什么會(huì)叫Code-First。你接下來(lái)可以用LINQ來(lái)查詢對(duì)象,它自己會(huì)把查詢轉(zhuǎn)換為SQL語(yǔ)句并在數(shù)據(jù)庫(kù)里執(zhí)行。nopcommerce擁有牛B的API讓你完全定制持久映射,你可以在這兒和這兒找到Code-First的資料。
\Libraries\Nop.Services
此項(xiàng)目包含一系列的核心服務(wù),業(yè)務(wù)邏輯,驗(yàn)證,如果有數(shù)據(jù)的話還有數(shù)據(jù)的計(jì)算方法,也就是傳說(shuō)中的業(yè)務(wù)訪問(wèn)層(BAL)\Plugins\文件夾中的那些項(xiàng)目Plugins是VS的解決方案文件夾,硬盤(pán)中它是在你解決方案的根目錄下。由于項(xiàng)目在編譯時(shí)的輸入路徑是”..\..\Presentation\Nop.Web\Plugins\{Group}.{Name}\”,這樣插件的DLL會(huì)自動(dòng)地放到\Presentation\Nop.Web\Plugins\文件夾中,用來(lái)放置已部署插件。這樣也能讓插件包含靜態(tài)文件比如CSS或JS,就不用在項(xiàng)目之間拷貝這些文件了。\Presentation\Nop.AdminNop.Admin是一MVC項(xiàng)目,如果你還從沒(méi)用過(guò)ASP.NETMVC,請(qǐng)猛擊\o"nopcommerce,MVC"這兒有更多信息??赡苣阋呀?jīng)猜到這是表示層中的管理后臺(tái),你可以在\Presentation\Nop.Web\Administration文件夾中找到它,此項(xiàng)目不能運(yùn)行。\Presentation\Nop.WebNop.Web也是一MVC項(xiàng)目,前臺(tái)網(wǎng)店的表示層,這個(gè)才是你真正要跑起來(lái)的項(xiàng)目,它也是整個(gè)應(yīng)用程序的起始項(xiàng)目。\Presentation\Nop.Web.FrameworkNop.Web.Framework是一個(gè)表示層的類庫(kù)項(xiàng)目,包括可以讓后臺(tái)和前臺(tái)使用的一些共用的展示功能。\Test\Nop.Core.TestsNop.Core.Tests是Nop.Core的測(cè)試項(xiàng)目\Test\Nop.Data.TestsNop.Data.Tests是Nop.Data的測(cè)試項(xiàng)目\Test\Nop.Services.TestsNop.Services.Tests是Nop.Services的測(cè)試項(xiàng)目\Test\Nop.TestsNop.Tests是一個(gè)類庫(kù),包含其它測(cè)試項(xiàng)目中要用的一共有類和輔助方法,此項(xiàng)目不包含任何測(cè)試用例擴(kuò)展現(xiàn)有實(shí)體-添加新的屬性Updatinganexistingentity.Howtoaddanewproperty.擴(kuò)展現(xiàn)有實(shí)體:如何添加一個(gè)新的屬性?ThistutorialcovershowtoaddapropertytotheAffiliateentitythatshipswiththenopCommercesourcecode.本教程將為代理商實(shí)體Affiliateentity添加一個(gè)屬性,附帶nopCom源碼。Thedatamodel數(shù)據(jù)模型Entitieswillhavetwoclassesthatareusedtomaprecordstoatable.Thefirstclassdefinestheproperties,fields,andmethodsconsumedbythewebapplication.實(shí)體將有兩個(gè)類用于映射記錄表:第一個(gè)類定義affiliate的屬性、字段和方法。FileSystemLocation文件位置:[ProjectRoot]\Libraries\Nop.Core\Domain\Affiliates\Affiliate.csAssembly程序集:Nop.CoreSolutionLocation解決方案中的位置:Nop.Core.Domain.Affiliates.Affilate.csThesecondclassisusedtomapthepropertiesdefinedintheclassabovetotheirrespectiveSQLcolumns.ThemappingclassisalsoresponsibleformappingrelationshipsbetweendifferentSQLtables.第二個(gè)類是將各屬性分別映射到對(duì)應(yīng)的SQL列,以及映射不同的SQL表之間的關(guān)系。FileSystemLocation:[ProjectRoot]\Libraries\Nop.Data\Mapping\Affiliates\AffiliateMap.cs
Assembly:Nop.Data
SolutionLocation:Nop.Data.Mapping.Affiliates.AffiliateMap.csAddthefollowingpropertytotheAffiliateclass.eq\o\ac(○,1)為Affiliate添加一個(gè)屬性:publicvirtualstringAffiliateWebSite{get;set;}
AddthefollowingcodetotheconstructoroftheAffiliateMapclass.eq\o\ac(○,2)為AffiliateMap添加一個(gè)構(gòu)造函數(shù):this.Property(m=>m.AffiliateWebSite).HasMaxLength(255).IsOptional();
BecauseI’mallaboutresults,atthispointIwouldrunthecode,re-installthedatabase,andverifythatthecolumnwascreatedappropriately.eq\o\ac(○,3)修改數(shù)據(jù)庫(kù),為Affiliate表添加列:AffiliateWebSite,允許為空,navrchar(255)。eq\o\ac(○,4)重新編譯程序Thepresentationmodel視圖模型Thepresentationmodelisusedtotransportinformationfromacontrollertotheview(readmoreat/mvc).Modelshaveanotherpurpose;definingrequirements.表示模型用于傳輸控制器的信息視圖(參考/mvc)。模型的另一個(gè)目的,定義需求。Weconfiguredourdatabasetoonlystore255charactersfortheAffiliateWebSite.IfwetryandsaveanAffiliateWebSitewith300characterstheapplicationwillbreak(ortruncatethetext).Wewanttheapplicationtoprotectusersfromfailuresthebestwecan,andourviewmodelshelpenforcerequirementslikestringlength.我們?cè)跀?shù)據(jù)庫(kù)中設(shè)定AffiliateWebSite長(zhǎng)度為255個(gè)字符,如果嘗試保存300個(gè)字符的,程序?qū)⒅袛啵ɑ蚪財(cái)辔谋荆?。因此需要通過(guò)程序強(qiáng)制用戶輸入不超過(guò)255個(gè)字符,盡可能地降低出錯(cuò)。FileSystemLocation:[ProjectRoot]\Presentation\Nop.Web\Administration\Models\Affiliates\AffiliateModel.cs
Assembly:Nop.Admin
SolutionLocation:Nop.Admin.Models.Affiliates.AffiliateModel.csThevalidatorclassisusedtovalidatethedatastoredinsideofthemodelclass(e.g.requiredfields,maxlength,andrequiredranges).驗(yàn)證輸入格式FileSystemLocation:[ProjectRoot]\Presentation\Nop.Web\Administration\Validators\Affiliates\AffiliateValidator.cs
Assembly:Nop.Admin
SolutionLocation:Nop.Admin.Validators.Affiliates.AffiliateValidator.csAddthepropertytoourviewmodel.eq\o\ac(○,5)添加視圖模型需要的屬性:[NopResourceDisplayName("Admin.Affiliates.Fields.AffiliateWebSite")]publicstringAffiliateWebSite{get;set;}Therequirementscodewillbeaddedintheconstructorofthevalidator.RuleFor(m=>m.AffiliateWebSite).Length(0,255);TheviewFileSystemLocation:[ProjectRoot]\Presentation\Nop.Web\Administration\Views\Affiliates\_CreateOrUpdate.cshtml
Assembly:Nop.Admin
SolutionLocation:Nop.Admin.Views.Affiliates._CreateOrUpdate.cshtmlViewscontainthehtmlfordisplayingmodeldata.Placethishtmlunderthe"active"section.eq\o\ac(○,6)在視圖中添加一行:<tr>
<tdclass="adminTitle">
@Html.NopLabelFor(model=>model.AffiliateWebSite):
</td>
<tdclass="adminData">
@Html.EditorFor(model=>model.AffiliateWebSite)
@Html.ValidationMessageFor(model=>model.Active)
</td></tr>ThecontrollerInthiscasethecontrollerisresponsibleformappingthedomaindatamodeltoourviewmodelandviceversa.ThereasonIchoosetheaffiliatemodeltoupdateisbecauseofthesimplicity.IwantthistobeanintroductiontothenopCommerceplatformandIwouldliketokeepitassimpleaspossible.在這種情況下,控制器負(fù)責(zé)域數(shù)據(jù)模型映射到視圖模型,反之亦然。這里之所以選擇“代理商”模型來(lái)更新是因?yàn)樗容^簡(jiǎn)單。以便盡可能簡(jiǎn)單地為大家介紹如何擴(kuò)展現(xiàn)有實(shí)體屬性。FileSystemLocation:[ProjectRoot]\Presentation\Nop.Web\Administration\Controllerss\AffiliateController.cs
Assembly:Nop.Admin
SolutionLocation:Nop.Admin.Controllers.AffiliateController.csWe'regoingtomakethreeupdatestotheAffiliateControllerclass.DataModel->ViewModelCreateViewModel->DataModelEditViewModel->DataModelNormallyIwouldwritetestsforthefollowingcodeandverifythatmodelmappingisworkingcorrectly,butI'llskipunittestingtokeepitsimple.我們將要進(jìn)行三次更新AffiliateController類。數(shù)據(jù)模型-視圖模型創(chuàng)建視圖模型->數(shù)據(jù)模型編輯視圖模型->數(shù)據(jù)模型通常情況下,我會(huì)寫(xiě)下面的代碼測(cè)試和驗(yàn)證模型的映射正常工作,但我會(huì)跳過(guò)單元測(cè)試,以保持它的簡(jiǎn)單。InthemethodPrepareAffiliateModeladdthefollowingcodebelowthemodel.Active=affiliate.Active:eq\o\ac(○,7)找到PrivatevoidPrepareAffiliateModel方法,在model.Active=affiliate.Active后中添加代碼:
model.AffiliateWebSite=affiliate.AffiliateWebSite;
InthepublicActionResultCreate(AffiliateModelmodel,boolcontinueEditing)methodaddthefollowingcodebelowaffiliate.Active=model.Active:eq\o\ac(○,8)找到publicActionResultCreate(AffiliateModelmodel,boolcontinueEditing)方法,在affiliate.Active=model.Active后添加代碼:affiliate.AffiliateWebSite=model.AffiliateWebSite;AsimilarchangeisrequiredinpublicActionResultEdit(AffiliateModelmodel,boolcontinueEditing):eq\o\ac(○,9)最后,在publicActionResultEdit(AffiliateModelmodel,boolcontinueEditing)方法中添加以下代碼:affiliate.AffiliateWebSite=model.AffiliateWebSite;TroubleshootingRecreatethedatabase.EitheryourowncustomSQLscriptorusethenopCommerceinstaller.Stopthedevelopmentwebserverbetweenschemachanges.Postadetailedcommentonourforums.
如何編寫(xiě)nopCommerce插件插件(Plug-in,又叫addin、add-in、addon或add-on)是一種電腦程序,通過(guò)和應(yīng)用程序的互動(dòng),用來(lái)替應(yīng)用程序增加一些所需要的特定的功能。(Wikipedia)插件用來(lái)擴(kuò)展nopCommerce的功能,nopcommcer有多種類型的插件。比如支付方式中的paypal,稅率供應(yīng)商,配送計(jì)算方式(UPS,USP,Fedex),小部件(livechat功能)等等。nopCommerce本身也自帶了很多不同的插件。你可以在官網(wǎng)上搜索是否已經(jīng)有人上傳了滿足你需要的插件。如果沒(méi)有,哥這就手把手帶你編寫(xiě)一個(gè)出來(lái)。插件結(jié)構(gòu),所用文件,所在位置1.你第一件事就是要在解決方案中新建一個(gè)“類庫(kù)”項(xiàng)目。最好的辦法是把插件都放在解決方案根目錄(不過(guò)小心不要和Nop.Web下邊的plugins目錄搞混了,那兒是放已布置插件的),而且最好把插件也都放在解決方案目錄的plugin目錄中(關(guān)于更多解決方案文件夾的信息,請(qǐng)猛擊此處)最好以這種方法來(lái)命名:”Nop.Plugin.{Group}.{Name}”。{Group}是你插件的分類(比如支付),{Name}是你的插件名(比如”AuthorizeNet”),那么Authorize.NET的支付插件就會(huì)有這樣的名字:Nop.Plugin.Payments.AuthorizeNet。2.一旦建立了插件項(xiàng)目,把輸入路徑改為”..\..\Presentation\Nop.Web\Plugins\{Group}.{Name}\”,比如Authorize.NET支付插件就會(huì)有這樣的輸入路徑:“..\..\Presentation\Nop.Web\Plugins\Payments.AuthorizeNet\”。搞定以后,對(duì)應(yīng)的插件DLL就會(huì)被拷貝到\Presentation\Nop.Web\Plugins\文件夾,nopCommerce內(nèi)核會(huì)搜索此文件夾。a.在項(xiàng)目菜單,點(diǎn)擊屬性
b.選擇生成選項(xiàng)卡
c.點(diǎn)擊輸入路徑旁邊的瀏覽按鈕選擇一個(gè)輸入目錄你要在debug和release模式下都要做此步驟。3.下一步你就要為你的每一個(gè)插件建立一個(gè)Description.txt,此文件包含描述插件的信息。你可以從其它插件目錄中拷出來(lái)。比如Authorize.NET支付插件的Description.txt就有如下內(nèi)容:Group:PaymentmethodsFriendlyName:CreditCardSystemName:Payments.AuthorizeNetVersion:1.00SupportedVersions:2.30Author:nopCommerceteamDisplayOrder:1FileName:Nop.Plugin.Payments.AuthorizeNet.dll其實(shí)所有的信息你都能看懂,不過(guò)有一些注意事項(xiàng)。SystemName必須唯一。Version字段是你插件的版本號(hào),你可以將它設(shè)置為你喜歡的任何值。SupportedVersions可以包含一個(gè)由逗號(hào)分隔的(確保nopCommerce當(dāng)前版本包含在此列表中,否則此插件沒(méi)戲)支持版本清單。FileName是用這個(gè)格式:Nop.Plugin.{Group}.{Name}.dll(是你插件的assembly文件名)。要確保此文件的“拷貝到輸入目錄”屬性是“Copyifnewer”
4.所需的最后一個(gè)步驟是創(chuàng)建一個(gè)類實(shí)現(xiàn)IPlugin接口(Nop.Core.Plugins命名空間)。nopCommerce有BasePlugin類已經(jīng)實(shí)現(xiàn)了一些IPlugin方法,這樣你就不用苦逼地再寫(xiě)一遍。nopCommerce還提供一些從IPlugin派生特定的接口。例如,俺們有“IPaymentMethod”接口,用于創(chuàng)建新的付款插件,它包含了一些特定的用于付款的方法如ProcessPayment()或GetAdditionalHandlingFee()。nopCommerce目前有以下特定的插件接口:
IExternalAuthenticationMethod.用來(lái)建立外部認(rèn)證方法如Facebook,Twitter,OpenID,etc.
IWidgetPlugin.讓你可以創(chuàng)建小部件,小部件在你網(wǎng)站的某些地方出現(xiàn),如左邊的Livechat框
IExchangeRateProvider.用于獲得貨幣匯率.
IDiscountRequirementRule.允許你創(chuàng)建新的折扣規(guī)則比如”帳單寄到的國(guó)家必須是……“
ISMSProvider.短信提供商,讓你可以在下單時(shí)收到短信通知。
IPaymentMethod.用于處理支付流程的插件。
IPromotionFeed.這些插件用于向Froogle或PriceGrabber提供產(chǎn)品信息
IShippingRateComputationMethod..這些插件是用于獲取可用的配送方法和正確的運(yùn)費(fèi)。例如,UPS,UPS,F(xiàn)EDEX等。
ITaxProvider.稅率提供商用于獲取稅率。處理請(qǐng)求??刂破鳎P秃鸵晥D?,F(xiàn)在你可以在Adminarea>Configuration>Plugins看到我們的插件了,不過(guò)正如你所想,這個(gè)杯具的插件啥都不能做,甚至連個(gè)配置的界面都沒(méi)有?,F(xiàn)在讓我們來(lái)創(chuàng)建一個(gè)配置頁(yè)面。我們現(xiàn)在需要做的是創(chuàng)建一個(gè)控制器,模型和視圖。MVC控制器負(fù)責(zé)響應(yīng)對(duì)一個(gè)ASP.NETMVC網(wǎng)站的請(qǐng)求。每個(gè)瀏覽器請(qǐng)求被映射到一個(gè)特定的控制器。一個(gè)視圖包含被發(fā)送到瀏覽器的HTML標(biāo)記和內(nèi)容。視圖是相當(dāng)于一個(gè)ASP.NETMVC應(yīng)用程序的頁(yè)面。一個(gè)MVC模型包含視圖或控制器以外的所有應(yīng)用程序邏輯。關(guān)于MVC模式在\o"MVC"這里你可以找到更多的信息。那么,我們可以開(kāi)工了:創(chuàng)建模型。新插件中加入一個(gè)Models文件夾,然后按你需要新加入一個(gè)模型類。
創(chuàng)建視圖。在插件項(xiàng)目中新加一個(gè)Views文件夾,再在里邊添加一個(gè){Name}文件夾,此處{Name}是指你的插件名。然后再添加一個(gè)Configure.cshtml文件。很重要的一點(diǎn):此視圖應(yīng)該要注明是嵌入資源。
創(chuàng)建控制器。在插件項(xiàng)目中新加一個(gè)controller文件夾,再新加一個(gè)控制器類。最好的命名辦法是像{Group}{Name}Controller.cs這樣如PaymentAuthorizeNetController。再好好地命名一個(gè)action方法用于配置。哥叫它“Configure”。準(zhǔn)備一個(gè)模型類并將其傳給這個(gè)視圖:Nop.Plugin.{Group}.{Name}.Views.{Group}{Name}.Configure,即那個(gè)嵌入視圖。比如你在Authorize.NET支付插件中的PaymentAuthorizeNetController實(shí)現(xiàn)你就會(huì)比較清楚。提示一:從其它插件項(xiàng)目中拷貝web.config到你項(xiàng)目里來(lái),這樣在做視圖的時(shí)候有智能感知(老?。喊??真的么?這和拷文件有什么關(guān)系?)。智能感知即微軟的自動(dòng)完成亮點(diǎn)。提示二:搞定以上步驟最簡(jiǎn)單的辦法是直接把其它插件項(xiàng)目拷貝過(guò)來(lái),然后文件和文件夾改名。提示三:如果你想限制后臺(tái)(店主)控制器的一些action方法,只用在方法上加[AdminAuthorize]屬性即可。提示四:接下來(lái)要確保所有第三方的程序集引用的“拷貝到本地”屬性設(shè)為false,這樣可以減小部署包的大小。比如Authorize.NET插件的項(xiàng)目結(jié)構(gòu)會(huì)如下圖:路由現(xiàn)在我們要為插件注冊(cè)相應(yīng)的路由。ASP.NET路由用于把瀏覽器發(fā)送的請(qǐng)求映射成MVC控制器相應(yīng)的action方法,接下來(lái)的步驟你會(huì)讀到很多詳細(xì)關(guān)于路由的信息。1.新建如下文件:RouteProvider.cs,它會(huì)向nopcommerce告知關(guān)于插件路由信息。比如下邊的RouteProvider添加了一個(gè)新的路由,可以通過(guò)瀏覽器路徑http://www.yourS/Plugins/PaymentAuthorizeNet/Configure來(lái)訪問(wèn):publicpartialclassRouteProvider:IRouteProvider{publicvoidRegisterRoutes(RouteCollectionroutes){routes.MapRoute("Plugin.Payments.AuthorizeNet.Configure","Plugins/PaymentAuthorizeNet/Configure",new{controller="PaymentAuthorizeNet",action="Configure"},new[]{"Nop.Plugin.Payments.AuthorizeNet.Controllers"});}publicintPriority{get{return0;}}}2.一些特寫(xiě)的插件接口(像上邊講的)和“IMiscPlugin”接口有一個(gè)方法“GetConfigurationRoute”。它應(yīng)該向控制器返回一個(gè)用于插件后臺(tái)配置的路由。實(shí)現(xiàn)你插件的“GetConfigurationRoute”方法,可以告知nopCommerce你插件的后臺(tái)配置路由是什么。如果你插件不需要后臺(tái)配置,那么此方法將返回NULL,比如下邊這樣:publicvoidGetConfigurationRoute(outstringactionName,
outstringcontrollerName,
outRouteValueDictionaryrouteValues)
{
actionName=“Configure”;
controllerName=“PaymentAuthorizeNet”;
routeValues=newRouteValueDictionary()
{
{“Namespaces”,“Nop.Plugin.Payments.AuthorizeNet.Controllers”},
{“area”,null}
};
}只要你有這個(gè)配置方法,插件安裝以后你就能在Admin>Configuration>Plugins找到一個(gè)配置鏈接。處理“安裝”和“卸載”方法這是可選步驟。一些插件需要有一定的安裝邏輯,比如插件要添加一些本地資源數(shù)據(jù)。在你的IPlugin實(shí)現(xiàn)中(大多數(shù)情況下是直接從BasePlugin類繼承下來(lái)),重載以下方法:1.Install:在插件安裝時(shí)會(huì)調(diào)用此方法,你可以在此初始化任何設(shè)置,添加新的本地資源數(shù)據(jù)或添加新的數(shù)據(jù)庫(kù)表(如果需要的話)2.Uninstall:在卸載插件時(shí)會(huì)調(diào)用此方法。重要說(shuō)明:如果你重載這些方法,不要隱藏基類的實(shí)現(xiàn)。比如重載”Install”的時(shí)候要記得調(diào)用base.Install(),Authorize.NET的install方法如下:publicoverridevoidInstall()
{
varsettings=newAuthorizeNetPaymentSettings()
{
UseSandbox=true,
TransactMode=TransactMode.Authorize,
TransactionKey=“123″,
LoginId=“456″
};
_settingService.SaveSetting(settings);base.Install();
}提示:已安裝的插件列表可以在\App_Data\InstalledPlugins.txt找到,這個(gè)列表是在安裝的時(shí)候創(chuàng)建的。升級(jí)nopCommerce可能會(huì)讓插件掛掉一些插件可能在新版本的nopCommerce中掛掉無(wú)法工作。如果在升級(jí)后有問(wèn)題,請(qǐng)刪除插件再到nopCommerce官網(wǎng)看看是否有些版本的插件下載。大部分的插件作者都會(huì)把他們的插件升級(jí)到新的版本,不過(guò)少數(shù)插件并不會(huì)跟隨著一起升級(jí)從而不再支持新版本。不過(guò)大多數(shù)情況下,你可以打開(kāi)相應(yīng)的Description.txt文件并編輯SupportedVersions字段。小結(jié)希望此文能讓你開(kāi)始nopCommerce的插件之旅并搞個(gè)出類拔萃的插件。
nopCommerce常見(jiàn)開(kāi)發(fā)問(wèn)題匯總以下列出的是程序猿攻城濕在開(kāi)發(fā)nopCommerce的時(shí)候經(jīng)常提出的問(wèn)題。它們也表現(xiàn)出nopCommerce團(tuán)隊(duì)對(duì)一些架構(gòu)的選擇。文章說(shuō)明:文章來(lái)源自我的博客,于原文之理解而翻譯,并非出版社那種按字詞翻譯風(fēng)格。歡迎各位提出意見(jiàn),也歡迎各位轉(zhuǎn)載不過(guò)務(wù)必注明本文原址。更多nopcommerce的文章請(qǐng)關(guān)注/?tag=nopcommerce,或者加入我們的QQ群101675096有哪些要求?NopCommerce的技術(shù)和系統(tǒng)要求可以在這兒找到(英文)程序猿如何向nopCommerce項(xiàng)目貢獻(xiàn)代碼?NopCommerce代碼托管在codeplexMercurial代碼庫(kù),用戶點(diǎn)此訪問(wèn)。借此公共代碼庫(kù),用戶可找到將要發(fā)布的修改和以前的設(shè)計(jì)決策。如果想知道codeplexMercurial對(duì)版本樹(shù)的支持請(qǐng)?jiān)谶@兒和這兒找更多信息。程序猿可以很容易地在我們的擴(kuò)展頁(yè)面上傳插件和語(yǔ)言包并分享給他人。要上傳擴(kuò)展,請(qǐng)?jiān)跒g覽器中訪問(wèn)我的帳號(hào),選擇“Yourcontributionsandextensions”選項(xiàng)卡,然后點(diǎn)擊“Uploadanewextension”按鈕。我如何報(bào)告一個(gè)缺陷?nopCommerce使用Codeplex作為官方缺陷跟蹤系統(tǒng),如果發(fā)現(xiàn)一個(gè)缺陷,可通過(guò)在Codeplex創(chuàng)建一個(gè)任務(wù)來(lái)報(bào)告給nopCommerce團(tuán)隊(duì)。程序猿或用戶也可以在我們的BugReports論壇版塊發(fā)帖子來(lái)告知新發(fā)現(xiàn)的缺陷。如果你的缺陷已經(jīng)被記錄當(dāng)然最好,正因?yàn)榇?,?yàn)證那些沒(méi)有被記錄的缺陷更為重要(比較拗口)。報(bào)告重復(fù)的缺陷會(huì)分心而且讓我們?cè)谛碌拈_(kāi)發(fā)和改缺陷上時(shí)間更少。nopCommerce的數(shù)據(jù)訪問(wèn)層Nop.Data項(xiàng)目包含一系列的類和函數(shù)來(lái)讀取和寫(xiě)入數(shù)據(jù)庫(kù)或是其它數(shù)據(jù)存儲(chǔ)介質(zhì)。Nop.Data項(xiàng)目有助于將數(shù)據(jù)訪問(wèn)的邏輯從你的業(yè)務(wù)對(duì)象中分離出來(lái)。NopCommerce使用EntityFramework(EF)Code-First,Code-First允許程序員在源代碼中定義實(shí)體(所有核心實(shí)體都在Nop.Core項(xiàng)目中定義),然后使用EF來(lái)生成基于C#類的數(shù)據(jù)庫(kù),這就是為何被稱為Code-First。你可以用LINQ來(lái)查詢你的對(duì)象,它會(huì)悄悄地把代碼轉(zhuǎn)化為SQL語(yǔ)句并在數(shù)據(jù)庫(kù)執(zhí)行。Nopcommerce有流利的API用于完全定制化的持久映射。如果想了解更多Code-First請(qǐng)?jiān)L問(wèn)這兒和這兒控制反轉(zhuǎn)和依賴注入控制反轉(zhuǎn)和依賴注入是兩個(gè)密不可分的方法用來(lái)分離你應(yīng)用程序中的依賴性??刂品崔D(zhuǎn)InversionofControl(IoC)
意味著一個(gè)對(duì)象不會(huì)新創(chuàng)建一個(gè)對(duì)象并依賴著它來(lái)完成工作。相反,它們從外部獲取它們想要的對(duì)象。依賴注入DependencyInjection(DI)
意味著在沒(méi)有對(duì)象的干預(yù)下,一般通過(guò)能傳入構(gòu)造參數(shù)和一系列屬性的框架組件完成。馬丁虎老二(MartinFowler)寫(xiě)過(guò)一篇關(guān)于依賴注入和控制反轉(zhuǎn)的牛B文章,我就不要再抄到這兒了,你可以在這兒找到。NopCommerce使用Autofac類庫(kù)作為IOC容器。只要你寫(xiě)了一個(gè)服務(wù)和此服務(wù)已實(shí)現(xiàn)的適當(dāng)接口,你應(yīng)該在任何實(shí)現(xiàn)了IDependencyRegistrar接口(Nop.Core.Infrastructure.DependencyManagement命名空間).的類里注冊(cè)它。比如所有nopCommerce的核心服務(wù)都在Nop.Web.Framework類庫(kù)的DependencyRegistrar類中已注冊(cè)。publicclassDependencyRegistrar:IDependencyRegistrar{publicvirtualvoidRegister(ContainerBuilderbuilder,ITypeFindertypeFinder){builder.Register(c=>c.Resolve().Request)
.As()
.InstancePerHttpRequest();
builder.Register(c=>c.Resolve().Response)
.As()
.InstancePerHttpRequest();你想創(chuàng)建多少依賴注冊(cè)類都可以。每一個(gè)類實(shí)現(xiàn)了IDependencyRegistrar接口的類都有一個(gè)Order屬性,可以用它來(lái)替換一個(gè)現(xiàn)有的依賴。要覆蓋nopcommerce的依賴,設(shè)置order屬性為大于0。Nopcommerce會(huì)對(duì)依賴排序,并按順序運(yùn)行,數(shù)字越大你的對(duì)象越遲被注冊(cè)。我如何注冊(cè)新的路由(路由?我覺(jué)得還是用routes比較好呢?)ASP.NET路由主要用于接受進(jìn)來(lái)的瀏覽器請(qǐng)求并把它映射到具體的MVC控制器action上。在此有更多信息。Nopcommerce有一個(gè)叫IRouteProvider的接口,用于在應(yīng)用程序開(kāi)始時(shí)注冊(cè)路由。所有的核心路由都在Nop.Web項(xiàng)目中的RouteProvider注冊(cè)。publicpartialclassRouteProvider:IRouteProvider{publicvoidRegisterRoutes(RouteCollectionroutes){//homepageroutes.MapLocalizedRoute(“HomePage”,“”,new{controller=“Home”,action=“Index”},new[]{“Nop.Web.Controllers”});你想創(chuàng)建多少RouteProvider都可以。比如,如果你的插件有定制路由,需要注冊(cè),于是你可以創(chuàng)建一個(gè)實(shí)現(xiàn)IRouteProvider接口的新類,再根據(jù)插件具體注冊(cè)路由。數(shù)據(jù)校驗(yàn)數(shù)據(jù)校驗(yàn)是一個(gè)用以保證程序操作干凈,正確和有用數(shù)據(jù)的流程。很多.NET程序猿使用DataAnnotationValidators,不過(guò)nopCommerce用的是FluentValidation,一個(gè)有著文藝青年般的接口和lambda表達(dá)式構(gòu)成的.NET的小型驗(yàn)證庫(kù),用以生成符合你業(yè)務(wù)需求的校驗(yàn)規(guī)則。在nopCommerce中你必須要通過(guò)2步來(lái)添加一個(gè)校驗(yàn)到一些模型中:1.創(chuàng)建一個(gè)繼承自AbstractValidator的類并把所有必須的驗(yàn)證邏輯都放入其中,看下邊這些應(yīng)該有所啟發(fā):publicclassAddressValidator:AbstractValidator
{
publicAddressValidator(ILocalizationServicelocalizationService)
{
RuleFor(x=>x.FirstName)
.NotEm
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園保育員兼職合同
- 文化藝術(shù)事業(yè)單位聘用合同指南
- 電梯銷售兼職合同
- 化工設(shè)備租賃合同樣本
- 體育用地土地抵押協(xié)議書(shū)
- 園林綠化圍墻施工協(xié)議
- 園林招投標(biāo)教案創(chuàng)新方案制定
- 博物館展覽場(chǎng)地租賃協(xié)議
- 汽車(chē)研發(fā)會(huì)議規(guī)范
- 海洋設(shè)備制造勞務(wù)合同樣本
- 《社交電商課件》-帶你了解社交電商的全過(guò)程
- Oxford-Phonics-World牛津自然拼讀課件Level1-Unit8
- 初中美術(shù)期末檢測(cè)方案
- 配電室運(yùn)行維護(hù)投標(biāo)方案(技術(shù)標(biāo))
- 初中化學(xué)試卷講評(píng)課件
- 瓶裝水項(xiàng)目市場(chǎng)營(yíng)銷方案
- 2024屆東北師大附中重慶一中等六?;瘜W(xué)高一第一學(xué)期期中檢測(cè)試題含解析
- 【幼兒園語(yǔ)言文字教學(xué)的規(guī)范化分析3000字(論文)】
- 瓶口分液器校準(zhǔn)規(guī)范
- (完整版)醫(yī)療器械網(wǎng)絡(luò)交易服務(wù)第三方平臺(tái)質(zhì)量管理文件
- 信息管理監(jiān)理實(shí)施細(xì)則水利水電工程
評(píng)論
0/150
提交評(píng)論