BodeAbp服务端只提供api,绝大部分api通过abp的动态WebApi机制提供,原理可以参考这篇文章:http://www.cnblogs.com/1zhk/p/5418694.html
与业务相关的api写在模块内部,这样服务端几乎都不需要有Controller了,目前整个项目只有“登录”和“文件上传”有Controller代码,最大化的减少业务模块与系统的耦合,也更方便业务模块的加载/卸载。
 
服务端目录结构:

BodeAbp.Frame:abp框架

BodeAbp.Modules:业务模块

BodeAbp.Plugins:插件

BodeAbp.Samples:示例

业务模块目录结构:
BodeAbp.Product:功能模块程序集
Localization:本地化资源文件夹
Providers:模块权限、菜单、设置项文件夹
Attributes:子功能文件夹(这里是商品属性)
Domain:领域层,存放聚合根、领域服务、值对象等。
Dtos:存放数据传输对象
ModelConfigs:存放Model配置类
SeedActions:存放种子数据(创建数据库或迁移数据库时添加到即数据库的数据)
...AppServices:应用程序服务,业务实现,是向外提供webapi的基础
 
Module中代码:
using System.Reflection;
using Abp.EntityFramework.Default;
using Abp.Localization.Dictionaries;
using Abp.Localization.Dictionaries.Xml;
using Abp.Modules;
using BodeAbp.Product.Providers; namespace BodeAbp.Product
{
/// <summary>
/// 产品模块
/// </summary>
public class BodeAbpProductModule : AbpModule
{
/// <summary>
/// 版本号
/// </summary>
public const string CurrentVersion = "0.1.0"; /// <summary>
/// 初始化前执行
/// </summary>
public override void PreInitialize()
{
Configuration.Localization.Sources.Add(
new DictionaryBasedLocalizationSource(
BodeAbpProductConsts.LocalizationSourceName,
new XmlEmbeddedFileLocalizationDictionaryProvider(
Assembly.GetExecutingAssembly(),
"BodeAbp.Product.Localization.Source"
)
)
); Configuration.Settings.Providers.Add<BodeAbpProductSettingProvider>();
Configuration.Navigation.Providers.Add<BodeAbpProductNavigationProvider>();
Configuration.Authorization.Providers.Add<BodeAbpProductAuthorizationProvider>(); DefaultDbContextInitializer.Instance.MapperAssemblies.Add(Assembly.GetExecutingAssembly());
} /// <summary>
/// 初始化执行
/// </summary>
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
} /// <summary>
/// 初始化后执行
/// </summary>
public override void PostInitialize()
{
base.PostInitialize();
}
}
}
关于abp中的模块机制,可以参考文章:http://www.cnblogs.com/farb/p/ABPModuleSystem.html
DefaultDbContextInitializer类是BodeAbp默认的数据库初始化类,可以仿造其实现将不同模块中的实体注册到不同的DbContext来达到分库的目的。DefaultDbContext默认读取webconfig中Default的连接字符串。
 
IApplicationService中代码:
using Abp.Application.Services;
using System.ComponentModel;
using Abp.Application.Services.Dto;
using BodeAbp.Product.Attributes.Dtos;
using System.Collections.Generic;
using System.Threading.Tasks; namespace BodeAbp.Product.Attributes
{
/// <summary>
/// 属性 服务
/// </summary>
[Description("属性接口")]
public interface IAttributesAppService : IApplicationService
{
#region 属性模版 /// <summary>
/// 获取 属性模版分页
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<PagedResultOutput<GetAttributeListOutput>> GetAttributePagedList(QueryListPagedRequestInput input); /// <summary>
/// 获取 属性模版详情
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
Task<GetAttributeOutput> GetAttribute(int id); /// <summary>
/// 添加 属性模版
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task CreateAttribute(CreateAttributeInput input); /// <summary>
/// 更新 属性模版
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task UpdateAttribute(UpdateAttributeInput input); /// <summary>
/// 删除 属性模版
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task DeleteAttribute(List<IdInput> input); #endregion #region 属性值 /// <summary>
/// 获取 属性值分页
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<PagedResultOutput<GetAttributeOptionListOutput>> GetAttributeOptionPagedList(QueryListPagedRequestInput input); /// <summary>
/// 获取 属性值详情
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
Task<GetAttributeOptionOutput> GetAttributeOption(int id); /// <summary>
/// 添加 属性值
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task CreateAttributeOption(CreateAttributeOptionInput input); /// <summary>
/// 更新 属性值
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task UpdateAttributeOption(UpdateAttributeOptionInput input); /// <summary>
/// 删除 属性值
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task DeleteAttributeOption(List<IdInput> input); #endregion #region 分类 /// <summary>
/// 获取 分类分页
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<PagedResultOutput<GetProductClassifyListOutput>> GetClassifyPagedList(QueryListPagedRequestInput input); /// <summary>
/// 获取 分类详情
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
Task<GetProductClassifyOutput> GetClassify(int id); /// <summary>
/// 添加 分类
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task CreateClassify(CreateProductClassifyInput input); /// <summary>
/// 更新 分类
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task UpdateClassify(UpdateProductClassifyInput input); /// <summary>
/// 删除 分类
/// </summary>
/// <param name="classifyId">分类Id</param>
/// <returns></returns>
Task DeleteClassify(int classifyId); #endregion
}
}

加载模块:

在WebApi项目的Module类中加载模块,代码如下:
using System.Reflection;
using System.Web.Http;
using Abp.Application.Services;
using Abp.Configuration.Startup;
using Abp.Modules;
using Abp.WebApi;
using Abp.WebApi.Controllers.Dynamic.Builders;
using Swashbuckle.Application;
using System.Linq;
using System.Web.Http.Cors;
using BodeAbp.Zero;
using System;
using WebDemo.WebApi.Swagger;
using BodeAbp.Activity;
using BodeAbp.Product; namespace WebDemo.WebApi
{
[DependsOn(
typeof(AbpWebApiModule)
, typeof(WebDemoCoreModule)
, typeof(BodeAbpZeroModule)
, typeof(BodeAbpActivityModule)
, typeof(BodeAbpProductModule))]
public class WebDemoWebApiModule : AbpModule
{
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); DynamicApiControllerBuilder
.ForAll<IApplicationService>(typeof(WebDemoCoreModule).Assembly, "app")
.Build(); DynamicApiControllerBuilder
.ForAll<IApplicationService>(typeof(BodeAbpZeroModule).Assembly, "zero")
.Build(); DynamicApiControllerBuilder
.ForAll<IApplicationService>(typeof(BodeAbpActivityModule).Assembly, "activity")
.Build(); DynamicApiControllerBuilder
.ForAll<IApplicationService>(typeof(BodeAbpProductModule).Assembly, "product")
.Build(); Configuration.Modules.AbpWebApi().HttpConfiguration.Filters.Add(new HostAuthenticationFilter("Bearer")); var cors = new EnableCorsAttribute("*", "*", "*");
GlobalConfiguration.Configuration.EnableCors(cors); ConfigureSwaggerUi();
} private void ConfigureSwaggerUi()
{
Configuration.Modules.AbpWebApi().HttpConfiguration
.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "WebDemo.WebApi");
//c.OperationFilter<AuthorizationOperationFilter>();
c.DocumentFilter<ApplicationDocumentFilter>();
c.IncludeXmlComments(GetXmlCommentsPath(typeof(WebDemoCoreModule)));
c.IncludeXmlComments(GetXmlCommentsPath(typeof(BodeAbpZeroModule)));
c.IncludeXmlComments(GetXmlCommentsPath(typeof(BodeAbpActivityModule)));
c.IncludeXmlComments(GetXmlCommentsPath(typeof(BodeAbpProductModule)));
c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
})
.EnableSwaggerUi(c => {
c.CustomAsset("index", typeof(WebDemoWebApiModule).Assembly, "WebDemo.WebApi.Swagger.index.html");
c.InjectStylesheet(typeof(WebDemoWebApiModule).Assembly, "WebDemo.WebApi.Swagger.theme-flattop.css");
c.InjectJavaScript(typeof(WebDemoWebApiModule).Assembly, "WebDemo.WebApi.Swagger.translator.js");
});
} private static string GetXmlCommentsPath(Type moduleType)
{
return string.Format(@"{0}\bin\{1}.XML", AppDomain.CurrentDomain.BaseDirectory, moduleType.Assembly.GetName().Name);
}
}
}
 
浏览Api:

确保webconfig中数据库连接正确,直接运行项目,浏览器访问:http://localhost:61759/swagger/ui/index#/,效果图如下:

BodeAbp采用了swagger展示api,关于swagger的配置参考WebApi项目的Module类中的ConfigureSwaggerUi方法。

BodeAbp服务端介绍的更多相关文章

  1. 数据同步canal服务端介绍

    1.下载安装包 canal&github的地址,最权威的学习canal相关知识的地方 https://github.com/alibaba/canal 在下面的wiki列表中找到AdminGu ...

  2. 服务端预渲染之Nuxt(介绍篇)

    现在前端开发一般都是前后端分离,mvvm和mvc的开发框架,如Angular.React和Vue等,虽然写框架能够使我们快速的完成开发,但是由于前后台分离,给项目SEO带来很大的不便,搜索引擎在检索的 ...

  3. 服务端渲染和nuxt简单介绍

    概述 最近研究了一下服务端渲染,有一些心得,记录下来供以后开发时参考,相信对其他人也有用. 参考资料: Vue SSR指南 nuxt.js官网 服务端渲染介绍 服务端渲染简单来说,就是分别对项目用we ...

  4. NFS介绍 NFS服务端安装配置 NFS配置选项

    NFS 介绍 • NFS是Network File System的缩写 • NFS最早由Sun公司开发,分2,,4三个版本,2和3由Sun起草开发,.0开始Netapp公司参与并主导开发,最新为4.1 ...

  5. 关于消息推送的补充,主要介绍服务端的实现,包含object c 版本 c 版本 java 版本 php 版本 (转)

    要实现消息推送功能,我们可以采用第三方(腾讯:信鸽:百度:云推送:极光推送:友盟):当然,因为各种原因,我们不能使用第三方的推送服务,那我们就需要自己编写服务端.在网上寻觅了很久,找到一篇很不错的讲解 ...

  6. NFS介绍、服务端安装配置、NFS配置选项

    6月21日任务 14.1 NFS介绍14.2 NFS服务端安装配置14.3 NFS配置选项 14.1 NFS介绍 14.2 NFS服务端安装配置 1.首先需要2台机器,一台是服务端,一台是客户端,分别 ...

  7. Linux centosVMware NFS介绍、NFS服务端安装配置、NFS配置选项

    一.NFS介绍 NFS是Network File System的缩写 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导开发,最新为4.1版 ...

  8. JSR-303 Bean Validation 介绍及 Spring MVC 服务端参数验证最佳实践

    任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用很多时候同样的数据验证逻辑会出现在不同的层,这样 ...

  9. JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践

    任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层, ...

随机推荐

  1. c#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)

    部门数据库的设计: 代码: /// <summary> /// 获取部门(入口) /// </summary> /// <returns></returns& ...

  2. EF的CodeFirst模式自动迁移(适用于开发环境)

    EF的CodeFirst模式自动迁移(适用于开发环境) 1.开启EF数据迁移功能 NuGet包管理器------>程序包管理控制台---------->Enable-Migrations ...

  3. 编写一个BAT脚本协助运维人员遇到问题时候调测数据库是否有效连接成功的操作攻略

    简单摘要: 1.内网系统出现故障需要排查 2.运维人员不熟悉数据库操作,没法通过连接数据库和执行SQL语句的方式排查数据库及数据是否正常 3.解决方案:编写一个bat脚本,运维人员双击运行即可.   ...

  4. php报错 【 Call to undefined function imagecreatetruecolor()】

    刚才在写验证码的时候,发现报错,然后排查分析了一下,原来是所用的php版本(PHP/5.3.13)没有开启此扩展功能. 进入php.ini 找到extension=php_gd2.dll ,将其前面的 ...

  5. SVPullToRefresh问题解决

    今天在使用SVPullToRefresh时发现当数据太少时,刷新的时候同时进行了上拉和下拉刷新,现解决方法如下: 解决办法: 1.打开iUIScrollView+SVInfiniteScrolling ...

  6. Static简介

    1.static称为静态修饰符,它可以修饰类中得成员.被static修饰的成员被称为静态成员,也成为类成员,而不用static修饰的成员称为实例成员. 2.当 Voluem volu1 = new V ...

  7. 【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】

    一.多继承 案例1:小孩继承自爸爸,妈妈.在程序入口模块再创建实例调用执行 #father模块 class Father(object): def __init__(self,money): self ...

  8. java注释讲解

    注释简单的来说就是一种说明,不能被当成执行语句执行.做为一名程序员,但我们在写代码时是顺着思路写下去的.写代码好比就是在做题.当你在做的时候你脑海时的思路很清晰,会想到用一些特殊的方法来解决当前的问题 ...

  9. java通过传入的日期,获取所在周的周一至周日

    public static void main(String[] args) { try { SimpleDateFormat sdf=new SimpleDateFormat("yyyy- ...

  10. 转://oracle 11gR2 oracle restart 单机使用asm存储 主机名发生更改处理过程

    oracle 11gR2 oracle restart 单机使用asm存储 主机名发生更改并且主机重启后处理过程: 以下为解决方案: 1. Remove Oracle Restart configur ...