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(); } } }