没有合适的资源?快使用搜索试试~ 我知道了~
首页ABP框架详解:领域驱动设计与分层架构
ABP框架详解:领域驱动设计与分层架构
需积分: 13 7 下载量 70 浏览量
更新于2024-07-18
收藏 24.51MB PDF 举报
ABP框架,全称ASP.NET Boilerplate Project,是一个旨在简化.NET企业级项目开发的开源框架。它的目标是帮助.NET开发者快速构建具备高度可扩展性和模块化的架构,特别是通过集成领域驱动设计(DDD)的最佳实践。框架的核心理念是分层设计,遵循DDD的四大基础层:表现层、应用层、领域层和基础设施层。 1. 表现层:这是用户与应用程序交互的界面,负责提供用户友好的接口,通常使用MVC或类似的架构实现。 2. 应用层:介于表现层和领域层之间,它组织业务逻辑,封装复杂的业务操作,并处理用户请求。应用服务是其核心组件,接收数据传输对象(DTO)作为输入,执行业务逻辑并返回结果,有助于解耦前端和后端。 3. 领域层:包含业务实体(如实体类,映射到数据库表),仓储(用于数据检索和持久化,由基础设施层实现)、领域事件(表示业务领域内的变化)和领域服务(处理跨实体的业务规则)。领域层应尽可能独立于具体的技术实现。 4. 基础设施层:为高层提供技术支撑,如ORM框架、数据库交互(如NHibernate)、分布式服务(如Web API或WCF)等,保证系统的稳定性和性能。 5. 可选层:如分布式服务层,用于服务的远程调用,增强了系统的可扩展性和松耦合性。 ABP框架强调每个层的职责明确,使得开发人员能够更高效地开发和维护代码,同时保证了代码的可重用性和可测试性。框架提供了许多便利的功能,如自动验证、数据映射工具(如AutoMapper),极大地简化了开发流程。ABP框架是一个强大的工具,可以帮助.NET开发者快速构建健壮的企业级应用,提升开发效率和代码质量。
资源详情
资源推荐
}
publicclassMyPersonManager:IPersonManager,ISingletonDependency
{
//...
}
用
这
种
方
式
,
你
可
以
轻
松
地
注
册
MyPersonManager
。
当
需
要
注
入
IPersonManager
的
时
候
,
就
会使
用
MyPersonManager
。
注
意
依
赖
声
明
为
Singleton
。
这
样
,
MyPersonManager
的
单
例
就
被
创
建
了
,
并
且
相
同
的
对
象
也
被
传
入到
所
有
的
类
中
。
只
有
在
第
一
次
使
用
时
才
会
创
建
,
以
后
再
整
个
应
用
的
生
命周
期
都
会使
用
相
同
的
实
例
。
自
定
义
/
直
接
注
册
如
果
之
前
描
述
的
方
法
还
不
能
满
足
你
,
那
么你
可
以
直
接
使
用
CastleWindsor
来
注
册
你
的
类
和
依
赖
。
这
样
,
你
就
在
CastleWindsor
中
注
册
任何
东
西
。
CastleWindsor
有
一个
为了
注
册
而
要
实
现
的
接
口
IWindsorInstaller
。
你
可
以
在
应
用
中
创
建
实
现
了
IWindsorInstaller
接
口
的
类
:
publicclassMyInstaller:IWindsorInstaller
{
publicvoidInstall(IWindsorContainercontainer,IConfigurationStorestore)
{
container.Register(Classes.FromThisAssembly().BasedOn<IMySpecialInterface>
().LifestylePerThread().WithServiceSelf());
}
}
ABP
会
自
动
找
到
并
执
行
这
个
类
。
最
后
,
可
以使
用
IIocManager.IocContainer
属
性
到
达
WindsorContainer
。
获
取
更
多
Windsor
信
息
,
请
查
看
官
方文
档
。
解
析
注
册
会
将
你
的
类
,
类
的
依
赖
和
生
命周
期
通
知
给
IOC
(
控
制
反
转
)
容
器
。
接
下
来
,
你
需
要
在
应
用
中
的
某
些
地
方
使
用
IOC
容
器
创
建
对
象
。
ABP
针
对
依
赖
的
解
析
提
供了
很
多
选
项
。
构
造
函
数
&
属
性
注
入
你
可
以
将
使
用
构
造
函
数
和
属
性
注
入
获
得
类
的
依
赖
作为
最
佳
实
践
。
无
论
在哪
里
,
你
都
应
该
这
样
做
。
例
如
:
publicclassPersonAppService
{
publicILoggerLogger{get;set;}
privateIPersonRepository_personRepository;
publicPersonAppService(IPersonRepositorypersonRepository)
{
_personRepository=personRepository;
Logger=NullLogger.Instance;
}
publicvoidCreatePerson(stringname,intage)
{
Logger.Debug("Insertinganewpersontodatabasewithname="+name);
varperson=newPerson{Name=name,Age=age};
_personRepository.Insert(person);
Logger.Debug("Successfullyinserted!");
}
}
IPersonRepository
从
构
造
函
数
注
入
,
ILogger
使
用
公共
属
性
注
入
。
这
样
的
话
,
你
的
代
码
根本
意
识
不
到
依
赖
注
入
系统
的
存
在
,
也
就
是
说
,
依
赖
系统
对
于
我
们
开
发
者
完
全
是
透
明
的
,
我
们
可
以
不
考
虑
依
赖
系统
内
部
的
实
现
细
节
。
这
是
使
用
DI
系统
最
合
适
的
方
式
。
IIocResolver
和
IIocManager
有时
,
你
可
能
必
须
要
直
接
解
析
依
赖
而
不
是
通过
构
造
函
数
和
属
性
注
入
。
这
种
情
况
要
尽
可
能
地
避
免
,
但
这
种
情
况
也
是有
可
能
的
。
ABP
提
供
了
很
多
可
以
轻
松
注
入
并
使
用
的
服
务
。
例
如
:
publicclassMySampleClass:ITransientDependency
{
privatereadonlyIIocResolver_iocResolver;
publicMySampleClass(IIocResolveriocResolver)
{
_iocResolver=iocResolver;
}
publicvoidDoIt()
{
//
手
动
解
析
varpersonService1=_iocResolver.Resolve<PersonAppService>();
personService1.CreatePerson(newCreatePersonInput{Name="Yunus",Surname="Emre"});
_iocResolver.Release(personService1);
//
安
全
地
解
析
并
使
用
using(varpersonService2=_iocResolver.ResolveAsDisposable<PersonAppService>())
{
personService2.Object.CreatePerson(newCreatePersonInput{Name="Yunus",Surname="Emre"});
}
}
}
在
以
上
例
子
中
的
MySampleClass
通过
构
造
函
数
注
入
IIocResolver
并
用
它
来
解
析
和
释
放
对
象
。
Resolve
方
法
有
许
多
重
载
可
供使
用
。
Release
方
法
用
来
释
放
组
件
(
对
象
)
。
调
用
Release
来
手
动
解
析
一个
对
象
是
很
关
键
的
,
否
则
,
应
用
会
有
内
存
泄
漏
问题
。
为了
确
保
释
放
对
象
,
要
尽
可
能
使
用
ResolveAsDisPosable(
如
例
子
中
演
示
的
那
样
)
。
在
using
块
的
末
尾
会
自
动
地
调
用
Release
。
如
果
你
想
要
直
接
使
用
IOC
容
器
(
CastleWindor
)
来
解
析
依
赖
,
那
么你
可
以
构
造
函
数
注
入
IIocManager
并
使
用
IIocManager.IocContainer
属
性
。
如
果
你
处
于
静
态
上下
文
或
者
不
能
注
入
IIocManager
,
那
么
最
后
的
机
会
就
是
,
你
可
以使
用
单
例
对
象
IocManager.Instance
。
但
是
,
这
种
情
况
不
容
易
测
试
。
其
他
IShouldInitialize
接
口
某
些
类
在
第
一
次
使
用
前
就
要
初
始
化
。
IShouldInitialize
接
口
有
一个
Initialize
方
法
。
如
果
实
现
了
该
接
口
,
那
么
在
创
建
对
象
之
后
(
使
用
前
)
就
会
自
动
地
调
用
Initialize
方
法
。
当
然
,
为了使
该
功
能
有
效
,
你
应
该
注
入
/
解
析
该
对
象
。
ASP.NETMVC
和
ASP.NETWebAPI
集
成
当
然
,
为了
解
析
依
赖
图
中
的
根
对
象
,
我
们
必
须
调
用
依
赖
注
入
系统
。
在
ASP.NETMVC
应
用
中
,
根
对
象
一
般
是
一个
Controller
类
。
我
们
也
可
以
在
控
制
器
中使
用
构
造
函
数
注
入
和
属
性
注
入
模
式
。
当
一个
请
求
到
达
应
用
时
,
IOC
容
器
创
建
了
控
制
器
对
象
,
然
后
所
有
的
依
赖
递
归
地
解
析
出
来
。
那
么
,
谁
处
理
的
这
个
呢
?
这
是
ABP
通过
扩
展
了
ASP.NETMVC
默
认
的
控
制
器
工
厂
自
动
完
成
的
。
相
似
地
,
对
于
ASP.NetWeb
API
也
是
如
此
。
你
不
必
关
心
创
建
和
释
放
对
象
的
事
情
。
会
话
AbpSession
介
绍
当应
用
程
序
要
求
用
户
登
录
时
,
那
么
应
用
程
序
也
需
要
知
道
当
前
用
户
正
在
执
行
的
操
作
。
虽
然
ASP.NET
本
身
在
展
现
层
提
供了
Session
对
象
,
但
ABP
也
提
供了
在
任何
需
要
获
得当
前
用
户
和
租
户
的
地
方
都
可
以使
用
的
IAbpSession
接
口
。
关于IAbpSession
为了获得实际的session信息,必须要实现IAbpSession接口。虽然你可以用自己的方式实现它,但在module-zero项目中已
经完全实现。
IAbpSession
已
经
完
全
集
成
到
ABP
(
实
例
的
设
置系统
和
授
权
系统
)
中
。
注
入
Session
IAbpSession
一
般
属
性
注
入
到
需
要
的
类
中
,
除非
没
有
Session
信
息
导
致
IAbpSession
不
可
能
工
作
。
如
果
我
们使
用
了
属
性
注
入
,
那
么
我
们
可
以使
用
NullAbpSession.Instance
作为
默
认
值
,
如
下
所
示
:
publicclassMyClass:ITransientDependency
{
publicIAbpSessionAbpSession{get;set;}
publicMyClass()
{
AbpSession=NullAbpSession.Instance;
}
publicvoidMyMethod()
{
varcurrentUserId=AbpSession.UserId;
//...
}
}
因
为
授
权是
应
用
层
的
事
儿
,
所
以
建
议
在
应
用
层
和
更
高
的
层
使
用
IAbpSession(
一
般
我
们
不
再
领
域
层
使
用
)
。
ApplicationService
,
AbpController
,
AbpApiController
已
经
注
入
了
AbpSession
。
因
此
,
你
可
以
直
接
在
应
用
层
服
务
方
法
中为
实
例使
用
AbpSession
属
性
。
使
用
Session
属
性
AbpSession
定
义了
一
些
key
属
性
:
UserId:
当
前
用
户
的
Id
。
值
为
null
,
表
示
当
前
的
用
户
不
存
在
。
如
果
调
用
的
代
码
授
权
给
某
个
用
户
的
话
,
那
么
值
不
为
null
。
TenantId:
当
前
租
户
的
Id
。
如
果
当
前
的
租
户
不
存
在
,
值
就
为
null
。
MultiTenancySide:
可
能
是
Host
(
租
主
)
或
者
Tenant
(
租
户
)
。
UserId
和
TenantId
是
nullable(
可
空
的
)
,
也
存
在
不
可
空
的
GetUserId()
和
GetTenantId()
方
法
。
如
果
你
确
定
当
前
的
用
户
存
在
,
那
么你
可
以
调
用
GetUserId()
。
如
果
当
前
的
用
户
为
null
,
那
么
该
方
法
就
会
抛
异常
。
GetTanantId()
也
是
类
似
的
。
日
志
记
录
服
务
端
ABP
使
用
的
是
CastleWindsor
的
日
志
记
录
设
备
。
它
可
以
和
不
同
的
日
志
类
库
一
起
工
作
,
比
如
Log4Net,NLog
,
Serilog
等等
。
Castle
为
所
有
的
日
志
类
库
提
供了
一个
公共
的
接
口
。
因
此
,
你
完
全
独
立
于
特
定
的
日
志
记
录
类
库
,
而
且,
如
果
需
要
的
话
,
你
可
以
轻
松
地
改
变
应
用
程
序
的
日
志
类
库
。
Log4Net
是
.Net
中
最
流
行
的
日
志
类
库
之
一
。
ABP
模
板
中
自
带
了
经
过
合
适配
置
的
Log4Net
。
但
是
,
只
存
在
一
行
log4net
的
依
赖
(
看
下
面
),
因
此
,
你
可
以
将它
改
为你
最
喜
欢
的
类
库
。
获
取
Logger
无
论
你
选
择
了什么
日
志
类
库
,
最
终
要记
录
的
日
志
代
码
都
是
相
同
的
(
这
得
感
谢
Castle
公共
的
ILogger
接
口
)
。
一
开
始
,
我
们
要
处
理
一下
记
录
日
志
的
Logger
对
象
。
因
为
ABP
强
烈
推
荐
使
用
依
赖
注
入
,
所
以
我
们
可
以使
用
属
性
注
入
模
式
轻
松
地
注
入
一个
Logger
对
象
。
如
下
所
示
:
usingCastle.Core.Logging;//1:
导
入
Logging
命名
空
间
publicclassTaskAppService:ITaskAppService
{
//2:
使
用
属
性
注
入
获
得
logger
publicILoggerLogger{get;set;}
publicTaskAppService()
{
//3:
如
果
没
有
提
供
Logger
,
就
不
能
记
录
日
志
Logger=NullLogger.Instance;
}
publicvoidCreateTask(CreateTaskInputinput)
{
//4:
记
录
日
志
Logger.Info("Creatinganewtaskwithdescription:"+input.Description);
//TODO:
保
存
到
数据
库
...
}
}
1.
导
入
Castle
的
ILogger
接
口
的
命名
空
间
。
2.
定
义
一个
公
有
的
叫
做
Logger
的
ILogger
对
象
。
这
是
记
录
日
志
的
对
象
。
创
建
TaskAppService
对
象
之
后
,
依
赖
注
入
系统
会
设
置
(
注
入
)
这
个
属
性
。
这
就
是
所
谓
的
属
性
注
入
模
式
。
3.
将
Logger
设
置
为
NullLogger.Instance
。
即
使
没
有
这
行
代
码
,
系统
也会
工
作
地
很
好
。
但
是
这
是
属
性
注
入
模
式
的
最
佳
实
践
。
如
果
没
给
Logger
设
置
任何
值
,
那
么
当
我
们使
用
它
的
时
候会
因
为
它
是
null
而
抛
出
“
空
指
针
”
异常
。
这
个
保
证
了
它
不
为
null
。
因
此
,
如
果
没
有
给
Logger
设
置
值
,
那
么
它
是
NullLogger
。
这
就
是
所
谓
的
null
对
象
模
式
。
NullLogger
实
际
上
什么
都
没
做
,
也
没
有
记
录
任何
日
志
。
因
此
,
我
们
的
类
要
不
要
一个
实
际
的
logger
都
能
工
作
。
4.
最
后
,
我
们
记
录
了
一个
info
等
级
的
日
志
文
本
。
存
在
多
种
不
同
的
等
级
(
看
下
面
)
。
如
果
我
们
调
用
了
CreateTask
方
法
,
并
检
查
日
志
文
件
,
就
会
看
到像
下
面
一
样
的
一
长
行
字
符
串
。
INFO2014071313:40:23,360[8]SimpleTaskSystem.Tasks.TaskAppServiceCreatinganewtaskwithdescription:
Remembertodrinkmilkbeforesleeping!
基
类
中
的
Logger
ABP
为
MVC
控
制
器
,
WebAPI
控
制
器
和
应
用
服
务
类
提
供了
基
类
。
比
如
,
Web
层对
应
的
基
类
是
XXXControllerBase(
后
缀
为
ControllerBase)
。
这
些
基
类
中
都
声
明
了
Logger
属
性
。
因
此
你
可
以
直
接
使
用
Logger
来
记
录
日
志
,
无
需
注
入
。
例
子
:
publicclassHomeController:SimpleTaskSystemControllerBase
{
publicActionResultIndex()
{
Logger.Debug("Asamplelogmessage...");
returnView();
}
}
注
意
,
SimpleTaskSystemControllerBase
是
继
承
了
AbpController
的
应
用
基
类
控
制
器
。
因
此
,
可
以
在
控
制
器
中
直
接
使
用
Logger
。
Logger
也
存
在
于
WebApi
控
制
器
的
AbpApiController
基
类
,
以
及
应
用
服
务
层
的
基
类
(
后
缀
为
AppServiceBase
的
类
)
。
你也
可
以为
其
他
的
类编
写
自
己
的
公共
基
类
,
这
样
,
你
就
不
需
要
每次
注
入
logger
了
。
配
置
当
你从
ABP
模
板
创
建应
用
程
序
时
,
Log4Net
的
所
有
配
置
已
经
完
成
了
。
默
认
的
日
志
格
式
配
置
如
下:
日
志
级
别
:
DEBUG,INFO,WARN,ERROR
或
者
FATAL
。
日
期
和
时
间
:
记
录
日
志
的
时
间
。
线
程
号
:
记
录
日
志
的
线
程
号
码
。
Logger
名
称
:
通
常
是
记
录
日
志
的
类
名
。
日
志
文
本
:
实
际
记
录
的
日
志
文
本
。
配
置
定
义
在
应
用
的
log4net.config
文
件中
,
如
下
所
示
:
<?xmlversion="1.0"encoding="utf8"?>
<log4net>
<appendername="RollingFileAppender"type="log4net.Appender.RollingFileAppender">
<filevalue="Logs/Logs.txt"/>
<appendToFilevalue="true"/>
<rollingStylevalue="Size"/>
<maxSizeRollBackupsvalue="10"/>
<maximumFileSizevalue="10000KB"/>
<staticLogFileNamevalue="true"/>
<layouttype="log4net.Layout.PatternLayout">
<conversionPatternvalue="%5level%date[%5.5thread]%40.40logger%message%newline"/>
</layout>
</appender>
<root>
<appenderrefref="RollingFileAppender"/>
<levelvalue="DEBUG"/>
</root>
<loggername="NHibernate">
剩余65页未读,继续阅读
myall2002
- 粉丝: 2
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- JDK 17 Linux版本压缩包解压与安装指南
- C++/Qt飞行模拟器教员控制台系统源码发布
- TensorFlow深度学习实践:CNN在MNIST数据集上的应用
- 鸿蒙驱动HCIA资料整理-培训教材与开发者指南
- 凯撒Java版SaaS OA协同办公软件v2.0特性解析
- AutoCAD二次开发中文指南下载 - C#编程深入解析
- C语言冒泡排序算法实现详解
- Pointofix截屏:轻松实现高效截图体验
- Matlab实现SVM数据分类与预测教程
- 基于JSP+SQL的网站流量统计管理系统设计与实现
- C语言实现删除字符中重复项的方法与技巧
- e-sqlcipher.dll动态链接库的作用与应用
- 浙江工业大学自考网站开发与继续教育官网模板设计
- STM32 103C8T6 OLED 显示程序实现指南
- 高效压缩技术:删除重复字符压缩包
- JSP+SQL智能交通管理系统:违章处理与交通效率提升
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功