手机版

基于nopCommerce的源代码开发框架

时间:2021-09-04 来源:互联网 编辑:宝哥软件园 浏览:

的开发者。NET应该都知道,知名的高质量b2c开源项目——nocommerce,是基于EntityFramework和MVC开发的,拥有透明且结构良好的解决方案,结合了开源和商业软件的最佳特性。官网地址:http://www.nopcommerce.com/,中文网:http://www.nopcn.com/.下载后,前后端如下图。如果还不了解项目,建议从官网下载代码,在本地运行,查看效果。

作者使用这个框架开发了许多项目。总的来说,它方便简洁,集成了很多由开发的常用组件和功能。NET。一直想分享,但是工作忙,没能实现。最近,我也有时间写这篇文章。本文将展示如何提取源代码的简化框架并附加源代码(基于nopCommerce3.9版本3.9)。如果你想了解框架并通过它开发项目,那么再次阅读这篇文章是有价值的。前排提示:这个框架的源代码已经上传到GitHub:https://github.com/dreling8/Nop.Framework.感兴趣的可以关注这个项目,其他的通用模块后面会增加,比如用户管理(IWorkContext)、插件功能、taskservice、日志、缓存、本地化等。欢迎星星来星星,你的支持是我的动力!

首先,了解项目结构

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

1.表示层(演示)

也可以称为应用层,只关注前端的集成,不涉及任何领域逻辑的实现。这一层只是为了展示,对于我们的框架来说是可选的,所以在提取框架的时候会被删除。

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

整个系统的服务层为各个领域提供接口和实现。这一层非常重要,为程序中的表示层提供接口服务,无论表示层使用mvc、winform还是app调用的webapi接口,都需要这一层。但是这一层的服务主要是电子商务的一些服务,对我们的框架来说是没有用的。因此,在这个框架中将删除所有服务,只添加一个测试服务类和接口。当应用于项目时,您应该在这个层中添加接口和服务。

3.数据层(Nop。数据)

Nop在数据层的仓库实现中使用ef和sqlserver数据库。如果您想扩展它,也可以在这个层中使用其他ORM映射库和数据库。该层的大部分功能将保留在框架中。

4.基础设施层(Nop。核心)

包括缓存实现、配置、域模型等等。部分功能将保留在框架中,域域模型将移出该层,成为一个单独的项目。你为什么要这么做?因为domain层通常会有很多调整,所以我通常会将Domain作为一个单独的项目。当然你不用调整,但是框架做了这个调整。

第二,删除与业务相关的代码

我们已经了解了Nop的整个代码层次,并基于以下两点开始修改项目源代码:1。框架够简单,没有电商业务。2.保留核心功能。建议在开始之前复制一个源代码保留。

1.测试项目:测试文件夹下有测试项目,这不是必需的。去掉所有的,发展特定的业务。您可以单独添加测试项目。既然是测试项目,删除后整个项目还是可以运行的。

2.表示层:这里的三个项目是前台、后端和两个项目共享的一些模块。就像测试项目一样,我们也在这里删除了所有内容。

3.插件项目:插件项目。像1和2一样,插件不是必须的。删除所有插件项目。只剩下三个项目了(欢迎关注github,以后我会写一篇关于如何添加插件的文章)。

Nop。服务:业务服务层,是一个程序集的内外接口层,需要预留。删除所有相关的业务服务类,包括与系统相关的日志、帮助和任务,以便更好地展示整个系统的结构。增加一个测试类,暂时什么都不写。

Nop。数据:数据层项目。这一层基本没有调整,只删除了EF的Mapping相关类。

Nop。核心:基础设施层。删除与电子商务业务相关的域名,创建一个新项目,Nop。领域

报告的错误,IWorkContext(工作上下文,用于获取用户信息和其他数据)依赖于Domain,因此将其删除。在此过程中,许多文件可能会被删除,直到项目不再报告错误。建成后,我们的项目结构如下。请注意,我们已经在Nop中移动了实体基类。核心到Nop。领域,而到了这一步,我们的基本框架结构已经大致出来了。

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

1.在本地Sqlserver中,创建一个新的数据库MyProject,并添加一个表Test。

使用[我的项目]GO/* * * * * object :表[dbo]。[测试]脚本日期: 05/24/2017 23:51:21 * * * * * */SET ANSI _ NULLS ONGOSET QUOTED _ IDENTIFIER ongorcrate 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 _ lock=on)on[primary]2上的[PRIMARY]。添加实体类和映射。在域项目下,创建一个新的测试目录并添加测试实体。在数据项目映射下,创建一个新的测试目录并添加EF映射类。

公共类TestEntity: BaseEntity{公共虚拟字符串名称{ get设置;}公共虚拟字符串Description { get设置;}公共虚拟DateTime?CreateDate { get设置;}}3.添加业务层方法。

在Nop。服务项目,在我们之前添加的接口和类下添加几个常见的凝乳方法,并实现它。这样,我们已经实现了业务层的代码。

///摘要///测试服务接口///summarypublic部分接口itest服务{///summary///get所有测试////summary///returnsTests/returnsIListTestEntity GetAllTests();///摘要///获取测试////summary///param name=' TestID '测试标识符/param///returns test/returns testonity GetTestById(int testId);///摘要///插入一个测试////summary///param name=' test ' test/param void insert test(TestEntity test);///摘要///更新测试////summary///param name=' test ' test/param void UpdateTest(TestEntity test);///摘要///删除一个测试////summary///param name=' test ' test/param void delete test(TestEntity test);}///摘要////测试服务////摘要公开分部类TestService : ITestService { # region Constants # end region # region field private readonly IRepositoryTestEntity _ testRepository;#结束区域#区域目录公共测试服务(irepostorytestentity测试存储库){这._测试存储库=测试存储库;} # end region # region Methods///summary///get all tests///summary///returns tests/returns public virtual ilitttenstantity GetAllTests(){ return _ testRepository .表。其中(p=p。名称!=null ).to list();}///摘要///获取一个主题////summary///param name=' TestID '测试标识符/param///返回test/返回public虚拟测试实体GetTestById(int testId){ if(testId==0)返回nullreturn _testRepository .GetById(testId);}///摘要////插入测试////summary////param name=' test ' test/param public虚空插入测试(TestEntity测试){ if(test==null)抛出新的ArgumentNullException('测试');_测试存储库.插入(测试);}///摘要////更新测试////summary////param name=' test ' test/param public virtual void UpdateTest(TestEntity test){ if(test==null)抛出新的ArgumentNullException('测试');_测试存储库.更新(测试);}///摘要////删除测试////summary////param name=' test ' test/param public virtual void delete test(TestEntity test){ if(test==null)抛出新的ArgumentNullException('测试');_测试存储库.删除(测试);}#endregion}四、添加陈述项目

有了业务服务,现在可以添加表现层项目来测试了。为什么不直接写测试项目?因为测试项目使用模拟的模拟数据,不能完整展示整个功能。

1.添加手动音量调节模板项目,通过nuget引入Autofac和Autofac .Mvc5。

2.添加容器注册类DependencyRegistrar,实现独立区域接口,这一步非常关键,我们将要用的接口和实现类注入到容器中。

///summary////Dependency Register////summary public class Dependency yregistrar : idependencyregister {///summary////Register服务和接口///summary///param name=' builder ' container builder/param///param name=' typeFinder ' type finder/param///param name=' config ' config/param public virtual void Register(container builder,ITypeFinder,noconfig config){//注入ObjectContextbuilder .RegisterIDbContext(c=new noobjectcontext(' test ')).instanceperlimitemessscope();//注入仰角指示器到仓储建筑商注册泛型(类型为(EfRepository)).作为(类型为(我的立场).instanceperlimitemessscope();//注入服务及接口建筑商registersassemblytypes(TestServiCe的类型).装配)。AsImplementedInterfaces().instanceperlimitemessscope();//注入控制器生成器寄存器控制器(TypeFinder .GetAssemblies().ToArray());}///摘要////此依赖关系注册器实现的顺序////汇总公共int Order { get { return 2;}}}3.配置文件中添加数据库访问节点

复制代码代码如下:添加名称="测试"连接字符串="数据源="。初始目录=我的项目;集成安全性=假;持续安全信息=假;用户标识=sa密码=sa 1234“providerName=”系统.数据SqlClient “/

4.应用启动时添加初始化引擎上下文

启动项目,这时无引擎会报错,因为我们没有使用Nopconfig来配置项目,在RegisterDependencies方法中注释NopConfig的注入,同时在初始化过程中将相关代码注释。这样就完成通过Autofac注入类到容器中。

公共类手动音量调节应用:系统网络。HttpApplication { protected void Application _ Start(){区域注册.registerelaris();FilterConfig .RegisterGlobalFilters(全局筛选器。过滤器);路由图。注册路由(路由表。路线);BundleConfig .注册捆绑包(BundleTable .捆绑包);//引擎上下文初始化EngineContext .初始化(假);}}//RegisterDependencies方法中注释NopConfig的注入//构建器。注册实例(配置)。AsNopConfig().单实例();public void Initialize(no cconfig){//register dependencies register dependencies(config);//没有使用配置,暂时注释//寄存器映射器配置//RegisterMapperConfiguration(config);//启动任务没有启用任务,注释//if(!配置IgnoreStartupTasks)//{//RunStartupTasks();//} }5.在控制器添加测试代码。将服务添加到家庭控制器,在构造函数中初始化。系统启动后会自动注入实例。通过断点我们看到,数据成功添加到了数据库。

公共类家庭控制器:控制器{ public ItestServiCe _ TestServiCe;公共HomeController(ITestService testService){ _ testService=testService;}公共操作结果索引(){ var entity=new TestEntity(){创建日期=DateTime .现在,描述='描述2 ',名称='测试数据2'};_testService .InsertTest(实体);var tests=_testService .GetAllTests();返回视图();}五、扩展到Webapi、Winform、WPF

现在再添加一个winform项目,同样的步骤添加相关的代码。在Winform中我们也能使用业务的服务了。

1.通过Nuget安装autofac,entityframework,添加项目图书馆下的引用。

2.添加依赖注册类,因为是winform项目,DependencyRegistrar这里需要做些调整,建议定义一个空接口IRegistrarForm,需要注入的形式实现IRegistrarForm。

///summary////Dependency Register////summary public class Dependency yregistrar : idependencyregister {///summary////Register服务和接口///summary///param name=' builder ' container builder/param///param name=' typeFinder ' type finder/param///param name=' config ' config/param public virtual void Register(container builder,ITypeFinder,noconfig config){//注入ObjectContextbuilder .RegisterIDbContext(c=new noobjectcontext(' test ')).instanceperlimitemessscope();//注入仰角指示器到仓储建筑商注册泛型(类型为(EfRepository)).作为(类型为(我的立场).instanceperlimitemessscope();//注入服务及接口建筑商registersassemblytypes(TestServiCe的类型).装配)。AsImplementedInterfaces().instanceperlimitemessscope();//注入控制器//构建器寄存器控制器(TypeFinder .GetAssemblies().ToArray());//注入formsvar types=AppDomain .CurrentDomain。GetAssemblies().选择许多(a=a.GetTypes().其中(t=t . GetInterfaces().包含(类型为(IRegistrarForm))).ToArray();foreach(类型中的var formtype){ builder .registersassemblytypes(formtype .装配);} }///摘要////此依赖关系注册器实现的顺序////汇总公共int Order { get { return 2;}}}3.在启动时添加EngineContext .初始化(假),启动项目,报错了,因为winform不能执行,对方法做些调整,添加一个参数是表单表示是否是winform,默认为假的。

///摘要///初始化not otherwise provided 除非另有规定工厂的静态实例////summary////param name=“强制重新创建”创建一个新的工厂实例,即使该工厂以前已经初始化过/param ///param name='isWinForm '是否客户端程序/param[method mpl(method mpl options).同步)]公共静态引擎初始化(bool forceRecreate,bool isw inform=false){ if(SingletonIEngine .实例==null | |强制重新创建){ SingletonIEngine .instance=new No engine();NopConfig config=nullif(!isw inform){ config=配置管理器.GetSection(' noconfig ')作为Nopconfig} else { //如果使用winform,使用此代码读取配置初始化noconfig var appSettings=配置管理器.应用设置应用设置中的foreach (var)键AllKeys) { } }单线引擎。实例。初始化(配置);}返回单线引擎。实例;}静态类程序{///摘要///应用程序的主入口点////总结[statthread]静态void Main(){应用程序.enablevisualstyle();申请setcompatiblextrenderingdefault(false);//应用。运行(新表格1());//引擎上下文初始化EngineContext .初始化(假,真);申请。运行(引擎上下文电流。解析表单1());}}4.从一开始中测试,成功调用了业务层的方法,这里我们并没有实例化ITestService,而是交给依赖注入自动实现。

公共分部类Form1 : Form,IRegistrarForm { private ITestService _ testService;公共表单1(ITestService testService){ InitializeComponent();_ testService=testService//如果不注入形式可以使用EngineContext .当前。ResolveITestService();得到实例}私人作废按钮1 _点击(对象发送者,EventArgs e){ var tests=_ testService .GetAllTests();}}至此,基于没有另外规定除非另有规定的精简开发框架基本完成,如果你有兴趣,建议在开源代码库关注该项目:https://github.com/dreling8/Nop .框架,欢迎星星给星星,你的支持是我的动力!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:基于nopCommerce的源代码开发框架是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。