原址:http://www.nopcommerce.com/docs/74/frequently-asked-development-questions.aspx

以下是开发者常见问题的清单。也介绍了一些nopCommerce开发团队的编码规范。

有什么要求?

nopCommerce技术和系统需求可以在这里找到。

开发者如何为nopCommerce项目做出贡献?

nopCommerce在Codeplex Mercurial托管了一个源码库,用户可以在这里查看。用户在公共库可以看到即将发生变化的设计决策,以及以前的设计决策。想了解更多关于Codeplex Mercurial对版本树的支持信息请点击这里.开发人员可以轻松地将其插件或语言包上传到我们的扩展部分,并与其他用户共享。要上传一个扩展信息请在Web浏览器中访问我的帐户页面,选择标有“Your contributions and extensions”选项卡,并单击“Upload a new extension”按钮。

如何报告一个BUG?

nopCommerce使用Codeplex作为官方BUG跟踪系统,如果发现一个BUG,可通过在Codeplex创建一个新的任务来报告给nopCommerce团队。开发者或用户也可以在我们的BUG论坛版块发帖子来告知新发现的BUG。通过这里你有机会验证你的BUG是否已经被提交,这个很重要。因为BUG的重复提交会浪费时间,减少我们在开发新功能和改其他BUG的时间。

数据访问层

该Nop.Data项目包含了一系列的类和函数来读取和写入数据库或其他数据存储介质。该Nop.Data库有助于将数据访问的逻辑从业务对象中分离出来(分离关注点)。 NopCommerce使用实体框架(EF)Code-First方法。Code-First允许开发人员在源代码中定义实体(所有核心实体在Nop.Core项目中定义),然后用EF来生成基于C# 类的数据库。这就是为什么它被称为Code-First。然后,您可以使用LINQ来查询对象,因为它会悄悄地把代码转化为SQL语句并在数据库执行。 NopCommerce采用了流畅的API来完全定制持久性映射。如果想了解更多Code-First请访问这里这里

控制反转和依赖注入

控制反转和依赖注入是两个密不可分的方法,用来分离你应用程序中的关注点。控制反转Inversion of Control (IoC)意味着一个对象不会新创建一个对象并依赖着它来完成工作.相反,它们从外部获取它们想要的对象.依赖注入Dependency Injection (DI) 意味着在没有对象的干预下,一般通过能传入构造参数和一系列属性的框架组件完成。Martin Fowler写过一篇关于依赖注入和控制反转的文章,我就不再重复了,你可以在这儿找到。NopCommerce使用Autofac类库作为IOC容器。只要你写了一个服务和此服务已实现的适当接口,你应该在实现了IDependencyRegistrar接口(Nop.Core.Infrastructure.DependencyManagement 命名空间)的类里注册它。比如所有nopCommerce的核心服务都在Nop.Web.Framework类库的DependencyRegistrar类中注册了。

 public class DependencyRegistrar : IDependencyRegistrar
{
public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder)
{
builder.Register(c => c.Resolve<HttpContextBase>().Request)
.As<HttpRequestBase>()
.InstancePerHttpRequest(); ...
}
}

代码示例

你想创建多少依赖注册类都可以。每一个类实现了IDependencyRegistrar接口的类都有一个Order属性,可以用它来替换一个现有的依赖。要覆盖nopcommerce的依赖,设置order属性大于0。Nopcommerce会对依赖排序,并按顺序运行,数字越大你的对象被注册的时间就会被推后。

如何新建一个新的routes

ASP.NET Routes负责接收传入的浏览器请求并把它映射到特定的MVC控制器Action操作上。在这里可以找到关于此路由的详细信息。 Nopcommerce有一个叫IRouteProvider的接口,用于在应用程序开始时注册路由。所有核心路由被注册在位于Nop.Web项目的RouteProvider类。

 public partial class RouteProvider : IRouteProvider
{
public void RegisterRoutes(RouteCollection routes)
{
//home page
routes.MapLocalizedRoute("HomePage",
"",
new { controller = "Home", action = "Index"},
new[] { "Nop.Web.Controllers" });
}
}

代码示例

你想创建多少RouteProvider都可以。比如你的插件有自定义路由,需要注册,你可以创建一个实现IRouteProvider接口的新类,再根据插件具体注册路由。

数据验证

数据验证是确保程序的数据操作能干净、正确和有用的过程。大多数.NET开发人员使用Data Annotation Validators。但nopCommerce使用Fluent Validation。是一个使用fluent接口和lambda表达式来生成业务逻辑验证规则的.NET小型验证类库。在nopCommerce必须以下两个步骤来添加一个校验到一些模型中:
1、创建一个从AbstractValidator类派生的类,并把所有必须的验证逻辑都放入其中,你可以从下面的代码中得到些启发:

  public class AddressValidator : AbstractValidator<AddressModel>
{
public AddressValidator(ILocalizationService localizationService)
{
RuleFor(x => x.FirstName)
.NotEmpty()
.WithMessage(localizationService.GetResource("Address.Fields.FirstName.Required"));
}
}

代码示例

2、添加ValidatorAttribute属性,如下:

  [Validator(typeof(AddressValidator))]
public class AddressModel : BaseNopEntityModel
{}

代码示例

当一个视图模型被提交到控制器,ASP.NET会执行相应的校验。

计划任务

有了计划任务,你可以在后台创建一个任务,让它在指定的时期里运行。比如nopCommerce会定时地发送队列中的email。任务是在ASP.NET线程池中由单独的线程执行。创建一个新的任务有如下基本步骤:

  1. 定义一个实现ITask接口的类。它只有一个不带参数的方法;执行。当任务启动的时候,这个方法会被调用。
  2. 计划任务开始时,应该插入一条新的ScheduleTask记录到相应的数据库表。您可以使用IScheduleTaskService来执行插入操作。

事件暴露和处理

事件是把消息广播给相关部分。事件是由数据改变来触发的如添加,更新和删除数据。NopCommerce允许开发者“监听”事件。开发者要想玩转事件基本上有如下两条路走:要么发布某个事件让其它人来用;要么用别的编好并发布的事件。

  1. 发布一个事件,必须先取得一个IEventPublisher实例再使用相应的数据一起调用Publish方法。
  2. 要监听一个事件,必须实现一个新的IConsumer泛型接口,一旦有人使用这个事件,nopCommerce会用反射来寻找并注册这个事件的实现。

 设置API

和其他网站平台一样,nopCommerce也有“网店名称”或“启用单页购买”这类设置,在nopCommerce中有两种办法来管理设置.

你可以用实现ISettingService接口的方法SetSettingGetSettingByKey来加载和保存单个设置。而在nopCommerce中最好的处理设置的办法是创建一个ISettingService接口的新实现。每个设置将变为C#属性,程序员在需要时应该使用setting类构建函数注入设置。以下是setting类的示例代码。

 public class MediaSettings : ISettings
{
public int AvatarPictureSize { get; set; }
public int ProductThumbPictureSize { get; set; }
public int ProductDetailsPictureSize { get; set; }
public int ProductThumbPictureSizeOnProductDetailsPage { get; set; }
public int ProductVariantPictureSize { get; set; }
public int CategoryThumbPictureSize { get; set; }
public int ManufacturerThumbPictureSize { get; set; }
public int CartThumbPictureSize { get; set; } public bool DefaultPictureZoomEnabled { get; set; } public int MaximumImageSize { get; set; }
}

代码示例

nopcommerce商城系统--开发者常遇问题清单的更多相关文章

  1. 部署NopCommerce商城系统问题整理

    NopCommerce是一个很棒的开源商城系统,下面整理一下我在部署使用NopCommerce系统中的一些问题. 我使用的是NopCommerce3.9版本. 1.安装 安装教程网上很多,这里不细说, ...

  2. nopcommerce商城系统--技术与系统需求

    原址:http://www.nopcommerce.com/technologysystemrequirements.aspx 在这里,我们将着眼于nopCommerce的系统要求.为了运行nopCo ...

  3. [转]nopcommerce商城系统--如何编写一个插件

    本文转自:http://www.cnblogs.com/ganqiyin/p/3680771.html 原址:http://www.nopcommerce.com/docs/77/how-to-wri ...

  4. nopcommerce商城系统--如何编写一个插件

    原址:http://www.nopcommerce.com/docs/77/how-to-write-a-nopcommerce-plugin.aspx plug-in (或 plugin)是一个为更 ...

  5. nopcommerce商城系统--文档整理

    原址:http://www.nopcommerce.com/documentation.aspx nopCommerce文档可以帮助您一步一步的搭建属于您自己的在线商城.根据该文档说明,您可以选择您想 ...

  6. nopcommerce商城系统--源代码结构和架构

    这个文档是让开发者了解nopcommerce解决方案结构的指南.这是新的nopcommerce开发者学习nopcommerce代码的相关文档.首先,nopCommerce源代码是很容易得到的.它是一个 ...

  7. nopcommerce商城系统--安装nopCommerce

    原址:http://www.nopcommerce.com/docs/79/installing-nopcommerce.aspx .NET Framework 4.5.1下载:http://www. ...

  8. nopcommerce商城系统--升级NopCommerce

    原址:http://www.nopcommerce.com/docs/80/upgrading-nopcommerce.aspx 本章介绍如何nopCommerce升级到最新版本.你可能希望这样做,你 ...

  9. 微信小程序购物商城系统开发系列-工具篇

    微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操作系统.新的生态,未来大部分应用场景都将 ...

随机推荐

  1. Spring Boot应用的测试——Mockito

    Spring Boot应用的测试——Mockito Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试:生成测试数据初始化数据库用于测试:Spring ...

  2. Flask—06-理解掌握flask数据模型(02)

    数据模型 模型关系 一对多(使用最多) 一:学生(Student) 需要添加反向引用 多:文章(Article) 需要添加外键关联 一对一 一:学生(Student),主表 需要添加反向引用,在一对多 ...

  3. 网页后缀html、htm、shtml、shtm有什么区别?

    每一个网页或者说是web页都有其固定的后缀名,不同的后缀名对应着不同的文件格式和不同的规则.协议.用法,最常见的web页的后缀名是.html和.htm,但这只是web页最基本的两种文件格式,今天我们来 ...

  4. jquery 层级选择器

    关于层级选择器. $("parent > child") 选择所有指定“parent”元素中指定的“child”的直接子项元素. parent :任何有效的选择器. chil ...

  5. Plupload+easyui+springmvc实现批量上传

    demo下载(java项目):http://pan.baidu.com/s/1ntmoGEd 可兼容所有常用浏览器,当前版本为V1.5.4,如果不兼容,肯定是你没有调试好啊 1.jsp代码 <% ...

  6. LeetCode 中级 - 有序链表转换二叉搜索树(109)

    给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10 ...

  7. [codevs1036] 商务旅行

    题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任 ...

  8. MySql学习笔记06

    课程回顾 一对一关联 案例1:查询每个员工的名字和主管领导的名字 select e.ename 员工姓名,m.ename 领导姓名 from emp e join emp m on e.mgr=m.e ...

  9. 【c学习-12】

    /*枚举*/ #include void enumFunction(){ enum enum_var{"a","b",1,2}; enum{"c&qu ...

  10. Lavavel5.5源代码 - 限流工具

    app('redis')->connection('default')->throttle('key000') // 每60秒,只能有10个资源被获取,在3秒内获取不到锁抛出异常 -> ...