基于nopCommerce的开发的B2C商城框架

基于nopCommerce的开发用户管理(IWorkContext)、插件功能、任务模块、日志、缓存、本地化

  • 商品编号:
    #17163683_171
    • 原价:
      免费
    • 会员价:
      免费
  • 分类:
    • V1.0.0
  • 数量:

购物车中已存在此商品,请在购物车中操作单击跳转购物车

  • 开发者:Mike's Blog
  • 开发语言:C#
  • 开发环境:Visual Studio 2015
  • 数据库:SqlServer
  • 商品架构:B/S
  • 代码管理工具:git
  • 大小(M):50 M
  • 编码格式:utf-8
  • 是否开源:是
  • 开源协议:Apache Licence 2.0
  • 博客地址:http://www.cnblogs.com/dreling/p/6906688.html

     .NET的开发人员应该都知道这个大名鼎鼎的高质量b2c开源项目-nopCommerce,基于EntityFramework和MVC开发,拥有透明且结构良好的解决方案,同时结合了开源和商业软件的最佳特性。官网地址:http://www.nopcommerce.com/,中文网:http://www.nopcn.com/。下载后前后端展示如下。如果你还未了解过该项目,建议从官网下载代码后在本地运行查看效果。

    笔者使用该框架开发过不少项目,总的来说,方便简洁,集成了.NET开发许多常用的组件和功能。一直想将它分享出来,但忙于工作而没有达成,最近也是有时间来写这篇文章,本文将展示如何提取该源码的精简框架并附上源码(基于nopCommerce3.9版本)。如果你想了解框架结构,通过该框架来开发项目,那么看一遍该文章是有价值的。后续会将其它的一些通用模块添加进去,如用户管理(IWorkContext 工作上下文)、插件功能、任务模块(taskservice)、日志、缓存、本地化等。


一、了解项目结构

    从项目结构图中我们也可以看出Nop的层次划分非常清晰,先看我画的层次图


    1. 展现层(Presentation)

        也可称之为应用层,只关注前端的整合,不涉及任何领域逻辑实现。这一层只做展现,对我们框架来说是可有可无的,因此提取框架时会将该层删除。

        2. 业务服务层(Nop.Services)

            整个系统的服务层,提供了对每个领域的接口和实现。这一层非常重要,提供了程序内对展现层的接口服务,不论展现层使用mvc,还是使用winform,异或是给app调用的webapi接口,都需要该层服务。但该层的服务主要是电商的一些服务,对我们框架无用,因此在这个框架中会删除所有服务,只添加一个测试服务类和接口,应用到项目中你应该在该层添加接口和服务。

        3. 数据层(Nop.Data)

            nop在数据层的仓储实现中使用了ef和sqlserver数据库,如果你想扩展,也可以在该层使用其它的ORM映射库和数据库。这一层的大部分功能我们会在框架中将保留。

        4. 基础设施层(Nop.Core)

            包括缓存的实现、配置、领域模型等等。在框架中会保留一部分功能,并将Domain领域模型移出该层做单独项目,为什么要这样做,因为通常情况下,Domain层的调整会比较多,所以我一般将Domain做单独Project,当然你也可以不调整,但框架做了该调整。

二、删除与业务相关的代码

  

    我们已经对Nop的整个代码层次结构有了了解,基于以下两点开始修改项目源码:1.框架足够精简,没有任何电商业务。2.核心功能保留。建议在开始前先copy一份源码保留。

    1. Test项目:Tests文件夹下面是测试项目,不是必需的,将它全部移除,开发具体业务,可以再单独添加测试项目。由于是测试项目,删除后整个项目还能跑起来。

    2. Presentation展现层:这里的三个项目,分别是前台,后端和两个项目共用的一些模块。和测试项目一样,这里我们也全部移除。

    3. Plugin项目:插件项目,同1、2一样,插件也不是必需的,移除所有的插件项目。现在只剩下三个项目了(欢迎关注该项目的github,后续我会专门写篇文章介绍如何添加插件)。

    4.Nop.Services:业务服务层,这一层是程序集内对外接口层,需要保留。删除所有相关的业务服务类,其中日志、帮助、任务等跟系统相关的都删除,目的是更好的展示整个系统的结构。添加一个测试类,暂时什么都不写。

    5.Nop.Data:数据层项目。这层基本不做调整,只删除EF的Mapping映射相关类。

    6.Nop.Core:基础设施层。删除电商业务相关的Domain,新建项目Nop.Domain。

 报错了,IWorkContext(工作上下文,用于获取用户信息等数据)依赖Domain,删除它。这个过程可能要删除不少文件,直到项目不再报错。完成后我们的项目结构如下,注意我们将Nop.Core中的实体基类移到了Nop.Domain中,到这一步,我们的基础框架结构已经大致出来了。

461326-20170526101256716-1086398331

三、添加数据库、数据实体、映射、业务层代码

    1. 在本地Sqlserver中,新建数据库MyProject,添加表Test。

USE [MyProject]

GO 

/****** Object: Table [dbo].[Test] Script Date: 05/24/2017 23:51:21 ******/

SET ANSI_NULLS ON

GO

 
SET QUOTED_IDENTIFIER ON

GO 

CREATE TABLE [dbo].[Test](

[Id] [int] NOT NULL,

[Name] [nvarchar](50) NOT NULL,

[Description] [nvarchar](200) NULL,

[CreateDate] [datetime] NULL,

CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED

(

[Id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

    2. 添加实体类和映射。在Domain项目下面新建Test目录,添加TestEntity。Data项目Mapping下新建Test目录,添加EF映射类。

public class TestEntity: BaseEntity
{

    public virtual string Name { get; set; }

    public virtual string Description { get; set; }

    public virtual DateTime? CreateDate { get; set; }
}
public class TestEntityMap : NopEntityTypeConfiguration<TestEntity>
{
    public TestEntityMap()
    {

        this.ToTable("TestTable");

        this.HasKey(t => t.Id);

        this.Property(t => t.Name).IsRequired().HasMaxLength(50);
    }
}

     3. 添加业务层方法。

  在Nop.Services项目里,在我们之前添加的接口和类下面添加几个常用的CURD方法,并实现它。这样我们就已经实现的业务层的代码了。

/// <summary>
/// Test service interface
/// </summary>
public partial interface ITestService
{

    /// <summary>
    /// Gets all tests
    /// </summary>
    /// <returns>Tests</returns>
    IList<TestEntity> GetAllTests();

    /// <summary>
    /// Gets a test
    /// </summary>
    /// <param name="testId">The test identifier</param>
    /// <returns>Test</returns>
    TestEntity GetTestById(int testId);

    /// <summary>
    /// Inserts a test
    /// </summary>
    /// <param name="test">Test</param>
    void InsertTest(TestEntity test);

    /// <summary>
    /// Updates the test
    /// </summary>
    /// <param name="test">Test</param>
    void UpdateTest(TestEntity test);

    /// <summary>
    /// Deletes a test
    /// </summary>
    /// <param name="test">Test</param>
    void DeleteTest(TestEntity test);
}
/// <summary>
/// Test service
/// </summary>
public partial class TestService : ITestService
{
    #region Fields
    
    private readonly IRepository<TestEntity> _testRepository;

    #endregion

    #region Ctor
    
    public TestService(IRepository<TestEntity> testRepository)
    {
        this._testRepository = testRepository;
    }
    
    #endregion

    #region Methods
    /// <summary>
    /// Gets all tests
    /// </summary>
    /// <returns>Tests</returns>
    public virtual IList<TestEntity> GetAllTests()
    {
        return _testRepository.Table.Where(p => p.Name != null).ToList();
    }

    /// <summary>
    /// Gets a topic
    /// </summary>
    /// <param name="testId">The test identifier</param>
    /// <returns>Test</returns>
    public virtual TestEntity GetTestById(int testId)
    {
        if (testId == 0)
        return null;
        return _testRepository.GetById(testId);
    }

    /// <summary>
    /// Inserts a test
    /// </summary>
    /// <param name="test">Test</param>
    public virtual void InsertTest(TestEntity test)
    {

        if (test == null)

        throw new ArgumentNullException("test");

        _testRepository.Insert(test);
    }

    /// <summary>
    /// Updates the test
    /// </summary>
    /// <param name="test">Test</param>
    public virtual void UpdateTest(TestEntity test)
    {
        if (test == null)

        throw new ArgumentNullException("test");

        _testRepository.Update(test);
    }
 
    /// <summary>
    /// Deletes a test
    /// </summary>
    /// <param name="test">Test</param>
    public virtual void DeleteTest(TestEntity test)
    {

        if (test == null)

        throw new ArgumentNullException("test");

        _testRepository.Delete(test);
    }

    #endregion
}


        详细信息请查看:http://www.cnblogs.com/dreling/p/6906688.html


权利声明:本站所有商品信息、客户评价等信息是初心商城重要的数据资源,未经许可,禁止非法转载使用。 注:本站商品信息均来自初心商城,其真实性、准确性和合法性由初心商城负责。

                  初心源说明:初心商城主要为程序员提供开发基础的代码源以及成熟项目,网站中所有的商品有提供收费版本的, 也有提供免费版本的,按照大家各自不同的需求进行购买。实实在在的让程序员只用专注于自己的业务实现你的小梦想, 如果您对我们的成果表示认同并且觉得对你有所帮助我们愿意接受来自各方面的支持^_^。

                  支持:用手机扫描二维码支付

                  支付宝支持我们 微信支持我们

                  您的支持将被用于:
                  1、持续深入的上传更多更好的源代码
                  2、建立更加完善的技术社区
                  3、完善现在系统出现各种问题
                  4、购买域名和租赁服务器

                  1、交易规则

                  2、发货方式

                  1、自动:在上方保障服务中标有自动发货的商品,拍下后,将会自动收到来自卖家的商品获取(下载)链接

                  2、手动:在上方保障服务中标有手动发货的商品,拍下后,卖家会收到邮件,也可通过QQ或订单中的电话联系对方。

                  3、退款说明

                  1、描述:源码描述(含标题)与实际源码不一致的(例:描述PHP实际为ASP、描述的功能实际缺少、版本不符等)

                  2、演示:有演示站时,与实际源码小于95%一致的(但描述中有"不保证完全一样、有变化的可能性"类似显著声明的除外)

                  3、发货:手动发货源码,在卖家未发货前,已申请退款的

                  4、服务:卖家不提供安装服务或需额外收费的(但描述中有显著声明的除外)

                  5、其它:如质量方面的硬性常规问题等

                  备注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。交易中的商品,卖家无法对描述进行修改!

                  4、注意事项

                  1、客户买完之后未确认收货,将不会收到下载地址和下载码,确认收货之后才能收到下载地址和下载码。

                  2、在未拍下前,双方在QQ上所商定的内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准);

                  3、在商品同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外);

                  4、在没有"无任何正当退款依据"的前提下,写有"一旦售出,概不支持退款"等类似的声明,视为无效声明;

                  5、虽然交易产生纠纷的几率很小,但请尽量保留如聊天记录这样的重要信息,以防产生纠纷时出现问题不明确的情况。

                  5、交易声明

                  1、本站作为直卖平台,依据交易合同(商品描述、交易前商定的内容)来保障交易的安全及买卖双方的权益;

                  2、非平台线上交易的商品,出现任何后果均与本站无关;无论卖家以何理由要求线下交易的,请联系管理举报。

                  初心Logo

                  初心商城| 初心系列| 初心博客| 初心公告| 系统反馈

                  © 2016-2018 山西米立信息技术有限公司 保留所有权利 京ICP备16055626号
                  违法和不良信息举报电话:186-2950-9347,本网站所列数据,除特殊说明,所有数据均出自我工作室
                  本网站兼容所有主流浏览器,不支持手机自适应