ABP架构学习系列三:手工搭建ABP框架

简介:   由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC、AOP、ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么多时间让人去慢慢研究。

  由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC、AOP、ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么多时间让人去慢慢研究。很久之前想手动搭建这个框架了,但是各种理由,你懂的。但是要在技术上得到大的提升就得静的下心去研究,学到大神的思想和精髓,运用到实际中去,才能去体验更开阔的天地。

  本文以创建博客为思路,一步步构建整个项目,在摸索中进步,也希望能够帮助到有需要的人。

一、基础架构

  第一部分主要是搭建好整个项目的骨架,连通各个项目

  创建MVC5项目(ZmBlog.Web),手动引入Abp、Abp.Web、Abp.Web.Mvc、Abp.Web.Api
  
  详情请看上一篇第一部分: http://www.cnblogs.com/xcsn/p/7941541.html
  接下来,继续创建其他类库ZmBlog.Core、ZmBlog.Infrastructure、ZmBlog.Application。
  引入相关nuget包,所有项目引用abp,ZmBlog.Infrastructure引用 Abp.EntityFramework,web项目引用后两个
Install-Package Abp -Version 0.8.4
Install-Package Abp.EntityFramework -Version 0.8.4
Install-Package Abp.Web.Mvc -Version 0.8.4
Install-Package Abp.Web.Api -Version 0.8.4
  

二、ZmBlog.Core

  ZmBlog.Core是DDD的核心,实体、领域服务、事件等一般都写在这里,同时也定义了仓储的接口,但实现放在基础设施层。
 首先,添加类ZmBlogCoreModule,如下
namespace ZmBlog.Core
{
    public class ZmBlogCoreModule:AbpModule
    { 
        public override void Initialize()
        { 
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); 
        }
    }
}

 ZmBlogCoreModule必须依赖于AbpModule,ZmBlogCoreModule是自定义模块第一个启动的,另外,ZmBlogCoreModule启动之前,abp会先启用内部的AbpKernelModule。

AbpKernelModule类是Abp框架自己的Module,它也跟所有其他的Module一样继承自AbpModule,重写PreInitialize,Initialize,PostInitialize三个主要成员。

更详细的请参考:https://www.cnblogs.com/Azula/archive/2015/11/23/4989157.html

 

现在,定义一个实体文章分类Category,继承自Entity<TPrimaryKey>

    public class Category: Entity<string>
    {
        public Category()
        {
            Id = Guid.NewGuid().ToString();
        }
        /// <summary>
        /// 类别名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 状态(0隐藏1显示)
        /// </summary>
        public int Status { get; set; }
    }

以下是Entity<TPrimaryKey>的成员,其中定义了主键Id(可重写)

 接着,添加一个仓储接口ICategoryRepository

public interface ICategoryRepository : IRepository<Category,string>{}

另外,还可以添加领域服务ICategoryDomainService、CategoryDomainService,对于业务简单的模块,可以去掉领域服务,直接在应用层处理。

public interface ICategoryDomainService:IDomainService{}

public class CategoryDomainService : DomainService, ICategoryDomainService{}

 三、ZmBlog.Infrastructure

1.定义模块

创建一个模块ZmBlogDataModule,依赖模块AbpEntityFrameworkModule会自动注册了所有仓储接口

[DependsOn(typeof(ZmBlogCoreModule),typeof(AbpEntityFrameworkModule))]
    public class ZmBlogDataModule : AbpModule
    { 
        public override void Initialize()
        {
             IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        }
    }

2.使用EF作为orm

 使用以下命令引入包

Install-Package EntityFramework -Version 6.1.3

Install-Package Castle.Windsor -Version 3.3.0

(1)创建ZmBlogDbContext

 public class ZmBlogDbContext: AbpDbContext
    {
        public ZmBlogDbContext()
            : base("DefaultConnection")
        {
        }

        public ZmBlogDbContext(string nameOrConnectionString)
            : base(nameOrConnectionString)
        {
        }

        //This constructor is used in tests
        public ZmBlogDbContext(DbConnection connection)
            : base(connection, true)
        {
        }

        public DbSet<Category> Categorys { get; set; }
        
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder); 
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();


            modelBuilder.Configurations.Add(new CategoryCfg());//使用独立配置 

        }
    } 

DefaultConnection是连接字符串名称,在web项目添加或修改如下

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=.;Initial Catalog=ZmBlogDb;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>

CategoryCfg是对实体类型的配置,如设置Id为主键

public class CategoryCfg: EntityTypeConfiguration<Category>
    {
        public CategoryCfg()
        {
            HasKey(s => s.Id);
        }
    }

 

(2)使用codefirst模式

1.启用迁移

启用:Enable-Migrations
自动生成配置文件:Configuration.cs
2.创建迁移
add-migration AddCategory
自动生成迁移文件:201712040256502_AddCategory
3.执行迁移
update-database -vebose
自动生成数据库ZmBlogDb、迁移记录表__MigrationHistory、表Categories

 (3)实现仓储

基础类BaseRepository,继承实现增删改查

public  abstract  class BaseRepository<TEntity, TPrimaryKey> :EfRepositoryBase<ZmBlogDbContext,TEntity,TPrimaryKey> where TEntity : class, IEntity<TPrimaryKey>
    {
        protected BaseRepository(IDbContextProvider<ZmBlogDbContext> dbContextProvider)
            : base(dbContextProvider)
        {

        }

        //add common methods for all repositories
    }
    public abstract class BaseRepository<TEntity> : BaseRepository<TEntity, string>
        where TEntity : class, IEntity<string>
    {
        protected BaseRepository(IDbContextProvider<ZmBlogDbContext> dbContextProvider)
            : base(dbContextProvider)
        {

        }

        //do not add any method here, add to the class above (since this inherits it)
    }

自定义的实现类,如下

 public class CategoryRepository : BaseRepository<Category, string>, ICategoryRepository
    {
        public CategoryRepository(IDbContextProvider<ZmBlogDbContext> dbContextProvider) : base(dbContextProvider)
        {
        }
    }

四、ZmBlog.Application

1.添加模块

添加模块 ZmBlogApplicationModule

namespace ZmBlog.Application
{
    [DependsOn(typeof(ZmBlogCoreModule), typeof(ZmBlogDataModule))]
    public class ZmBlogApplicationModule:AbpModule
    {
        public override void Initialize()
        { 
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        }
    }
}

2.创建服务

在项目下添加文件夹Categories,然后添加服务接口和实现类,如

ICategoryApp

public interface ICategoryApp:IApplicationService
    {
        string GetCategoryName(string id);
    } 

CategoryApp

namespace ZmBlog.Application.Categories
{
    public class CategoryApp : ApplicationService, ICategoryApp
    {
        private readonly IRepository<Category, string> _categoryRepository;

        public CategoryApp(IRepository<Category, string> categoryRepository)
        {
            _categoryRepository = categoryRepository;
        }

        //private readonly ICategoryRepository _categoryRepository;

        //public CategoryApp(ICategoryRepository categoryRepository)
        //{
        //    _categoryRepository = categoryRepository;
        //}


        public string GetCategoryName(string id)
        {
            //var categoryData = _categoryRepository.GetAll().FirstOrDefault(s=>s.Name == "硬件");

            var category = new Category()
            {
                Name = "硬件" + DateTime.Now.ToString("yy-MM-dd HH:mm:ss"),
                Status = 1
            };
            _categoryRepository.Insert(category);

            CurrentUnitOfWork.SaveChanges();
            return category.Name;
        }
    }
}

五、ZmBlog.Web修改

1.增加依赖

ZmBlogWebModule是web的模块,上一篇文章创建的,增加依赖ZmBlogApplicationModule

[DependsOn(typeof(AbpWebMvcModule),typeof(ZmBlogApplicationModule))]
    public class ZmBlogWebModule:AbpModule
{
    //...
}

2.修改控制器

public class HomeController : AbpController
    {
        private ICategoryApp _categoryApp;
        public HomeController(ICategoryApp categoryApp)
        {
            _categoryApp = categoryApp;
        }
        public ActionResult Index()
        {
            try
            {  
                ViewBag.Name = _categoryApp.GetCategoryName("");
            }
            catch (Exception e)
            {
                ViewBag.Name = "默认分类"; 
                throw;
            }

            return View();
        }
//.....省略

3.页面修改

@{
    ViewBag.Title = "Home Page";
}

<div class="jumbotron">
    <h1>I Like @ViewBag.Name</h1> 
</div> 

去掉没用的,直接展示效果

 六、展示

运行起来的效果

数据库

由于时间原因,一些细节没有详细讲,如有不清楚请留言

 

 源码下载:https://github.com/jackchn/cnblogs-xcsn-source下的ZmBlogStudy.rar

 

相关文章
|
3月前
|
存储 边缘计算 Cloud Native
“论模型驱动架构设计方法及其应用”写作框架,软考高级,系统架构设计师
模型驱动架构设计是一种用于应用系统开发的软件设计方法,以模型构造、模型转换和精化为核心,提供了一套软件设计的指导规范。在模型驱动架构环境下,通过创建出机器可读和高度抽象的模型实现对不同问题域的描述,这些模型独立于实现技术,以标准化的方式储存,利用模型转换策略来驱动包括分析、设计和实现等在内的整个软件开发过程。
|
3月前
|
分布式计算 大数据 数据处理
经典大数据处理框架与通用架构对比
【6月更文挑战第15天】本文介绍Apache Beam是谷歌开源的统一数据处理框架,提供可移植API,支持批处理和流处理。与其他架构相比,Lambda和Kappa分别专注于实时和流处理,而Beam在两者之间提供平衡,具备高实时性和数据一致性,但复杂性较高。选择架构应基于业务需求和场景。
110 3
经典大数据处理框架与通用架构对比
|
2月前
|
存储 分布式数据库 数据库
Hbase学习二:Hbase数据特点和架构特点
Hbase学习二:Hbase数据特点和架构特点
43 0
|
3天前
|
XML 开发框架 .NET
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
32 1
|
28天前
|
机器学习/深度学习 算法 网络架构
神经网络架构殊途同归?ICML 2024论文:模型不同,但学习内容相同
【8月更文挑战第3天】《神经语言模型的缩放定律》由OpenAI研究人员完成并在ICML 2024发表。研究揭示了模型性能与大小、数据集及计算资源间的幂律关系,表明增大任一资源均可预测地提升性能。此外,论文指出模型宽度与深度对性能影响较小,较大模型在更多数据上训练能更好泛化,且能高效利用计算资源。研究提供了训练策略建议,对于神经语言模型优化意义重大,但也存在局限性,需进一步探索。论文链接:[https://arxiv.org/abs/2001.08361]。
21 1
|
8天前
|
资源调度 分布式计算 监控
【揭秘Hadoop YARN背后的奥秘!】从零开始,带你深入了解YARN资源管理框架的核心架构与实战应用!
【8月更文挑战第24天】Hadoop YARN(Yet Another Resource Negotiator)是Hadoop生态系统中的资源管理器,为Hadoop集群上的应用提供统一的资源管理和调度框架。YARN通过ResourceManager、NodeManager和ApplicationMaster三大核心组件实现高效集群资源利用及多框架支持。本文剖析YARN架构及组件工作原理,并通过示例代码展示如何运行简单的MapReduce任务,帮助读者深入了解YARN机制及其在大数据处理中的应用价值。
19 0
|
24天前
|
监控 架构师 项目管理
项目管理架构师的角色与职责:构建高效项目交付框架
【8月更文第7天】在当今快速变化的商业环境中,组织需要灵活高效的项目交付机制来应对不断出现的新挑战。项目管理架构师(Project Management Architect, PMA)作为一种新兴的角色,在确保项目成功交付方面扮演着至关重要的角色。本文将探讨PMA的核心职责,以及他们如何通过设计和实施项目管理流程来提高项目的可扩展性和适应性,并通过有效的项目治理来提升团队的整体表现。
49 0
|
2月前
|
消息中间件 Java 开发者
Spring Cloud微服务框架:构建高可用、分布式系统的现代架构
Spring Cloud是一个开源的微服务框架,旨在帮助开发者快速构建在分布式系统环境中运行的服务。它提供了一系列工具,用于在分布式系统中配置、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等领域的支持。
128 5
|
3月前
|
存储 数据采集 数据挖掘
“湖仓一体架构及其应用”写作框架,系统架构设计师
随着5G、大数据、人工智能、物联网等技术的不断成熟,各行各业的业务场景日益复杂,企业数据呈现出大规模、多样性的特点,特别是非结构化数据呈现出爆发式增长趋势。在这一背景下,企业数据管理不再局限于传统的结构化OLTP(On-Line Transaction Processing)数据交易过程,而是提出了多样化、异质性数据的实时处理要求。传统的数据湖(Data Lake)在事务一致性及实时处理方面有所欠缺,而数据仓库(Data Warehouse)也无法应对高并发、多数据类型的处理。因此,支持事务一致性、提供高并发实时处理及分析能力的湖仓一体(Lake House)架构应运而生。湖仓一体架构在成本、
|
2月前
|
开发框架 前端开发 关系型数据库
ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据
ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据

热门文章

最新文章

下一篇
云函数