据书上说DDD的.NET开荒框架 – ABP初探

1、基本概念

ABP是“ASP.NET Boilerplate Project
(ASP.Net榜样项目)”的简称。

ABP是土耳其共和国(The Republic of Turkey)的一个人架构师hikalkan开采的,今后又加入多个ismcagdas开垦者。

AngularJS 1

ASP.NET
Boilerplate是二个用一流实践和流行技能开垦今世WEB应用程序的新起源,它意在成为多个通用的WEB应用程序框架和体系模板。

ABP的官网:http://www.aspnetboilerplate.com

Github上的开源项目:https://github.com/aspnetboilerplate

ABP官方文书档案:http://www.aspnetboilerplate.com/Pages/Documents

强烈提议从事.NET的程序员学习下。

二、技术点

1、服务端

依据最新的.NET本领 (方今是ASP.NET MVC 伍、Web API 2、C# 伍.0,在ASP.NET
五号正楷字式发表后会进级)

贯彻世界驱动设计(实体、仓储、领域服务、领域事件、应用服务、数据传输对象,工作单元等)

兑现分层系列布局(领域层,应用层,展现层和基础设施层)

提供了一个基础架构来开荒可接纳可布置的模块

集成1些最盛行的开源框架/库,或许有个别是您正在选择的。

提供了2个基础架构让我们很方便地选择倚重注入(使用Castle
温泽作为依靠注入的器皿,为啥未有用autofac??)

提供Repository仓库储存格局扶助分化的O途达M(已落实Entity Framework
、NHibernate、MangoDb和内部存款和储蓄器数据库

援助并促成数据库迁移(EF 的 Code first)

模块化开拓(每一个模块有单独的EF DbContext,可独立钦命数据库)

席卷一个大致的和灵活的多语言/本地化系统

席卷三个 伊芙ntBus来落成服务器端全局的园地事件

集合的不行处理(应用层大致不需求处理本人写相当处理代码)

数据有效性验证(Asp.NET
MVC只可以实现Action方法的参数验证,ABP达成了Application层方法的参数有效性验证)

由此Application Services自动创设Web Api层(不要求写ApiController层了)

提供基类和救助类让大家有益地完毕部分常见的义务

使用“约定优于配备标准”

2、客户端

Bootstrap、Less、AngularJSjQuery、Modernizr和其他JS库:
jQuery.validate、jQuery.form、jQuery.blockUI、json2

为单页面应用程序(AngularJs、Durandaljs)和多页面应用程序(Bootstrap+Jquery)提供了品种模板。

自行创造JavaScript 的代理层来更方便使用Web
Api

包装1些Javascript
函数,更有益地运用ajax、新闻框、文告组件、忙状态的遮罩层等等

3、zero模块

身份验证与授权管理(通过ASP.NET Identity完毕的)

用户&角色管理

系统安装存取管理(系统级、租户级、用户级,功效范围自动管理)

审计日志(自动记录每3次接口的调用者和参数)

 

以上摘自阳铭连串教程

三、从ABP官方网址获取模版

ABP模版地址:http://www.aspnetboilerplate.com/Templates

AngularJS 2

一、选拔选用MPA,因为AngularJs或DurandalJs不太懂;

2、选择ORM框架(Entity Framework或NHibernate)我选择EF;

三、zero模块先不要选用

四、起个名字,小编起的FirstABP

点击“CREATE MY PROJECT”下载贰个zip压缩文件,用vs20一3张开如下结构:

AngularJS 3

张开各类品种里引用了Abp组件和任何第一方组件,必要Nuget重新引用下,

AngularJS 4

AngularJS 5

生成下看看还有没错误,然后把FirstABP.Web设为初叶项目,F伍

AngularJS 6

四、简单Demo

1、在FirstABP.Core 新建People文件夹,然后建一个Person实体

AngularJS 7

using Abp.Domain.Entities;

namespace FirstABP.People
{
    public class Person : Entity
    {
        public virtual string Name { get; set; }

        public virtual int? Age { get; set; }
    }
}

AngularJS 8

实体承袭Abp.Domain.Entities.Entity基类,暗中同意会有贰个int类型自增的Id,要是想用别的品种能够钦定,例如Abp.Domain.Entities.Entity<string>

二、把新建的Person实体类出席加多到IDbSet

在FirstABP.EntityFramework类库EntityFramework文件夹下的FirstABPDbContext文件之中

AngularJS 9

using System.Data.Entity;
using Abp.EntityFramework;
using FirstABP.People;

namespace FirstABP.EntityFramework
{
    public class FirstABPDbContext : AbpDbContext
    {
        //TODO: Define an IDbSet for each Entity...
        public virtual IDbSet<Person> Person { get; set; }
        //Example:
        //public virtual IDbSet<User> Users { get; set; }

        /* NOTE: 
         *   Setting "Default" to base class helps us when working migration commands on Package Manager Console.
         *   But it may cause problems when working Migrate.exe of EF. If you will apply migrations on command line, do not
         *   pass connection string name to base classes. ABP works either way.
         */
        public FirstABPDbContext()
            : base("Default")
        {

        }

        /* NOTE:
         *   This constructor is used by ABP to pass connection string defined in FirstABPDataModule.PreInitialize.
         *   Notice that, actually you will not directly create an instance of FirstABPDbContext since ABP automatically handles it.
         */
        public FirstABPDbContext(string nameOrConnectionString)
            : base(nameOrConnectionString)
        {

        }
    }
}

AngularJS 10

叁、Database Migrations成立库和表

FirstABP.Web的webconfig,自动创立FirstABP数据库

  <connectionStrings>
    <add name="Default" connectionString="Server=localhost; Database=FirstABP; Trusted_Connection=True;" providerName="System.Data.SqlClient"/>
  </connectionStrings>

修改SimpleTaskSystem.EntityFramework项目下Migrations文件夹下的Configuration.cs文件

AngularJS 11

using System.Data.Entity.Migrations;
using FirstABP.People;

namespace FirstABP.Migrations
{
    internal sealed class Configuration : DbMigrationsConfiguration<FirstABP.EntityFramework.FirstABPDbContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            ContextKey = "FirstABP";
        }

        protected override void Seed(FirstABP.EntityFramework.FirstABPDbContext context)
        {
            // This method will be called every time after migrating to the latest version.
            // You can add any seed data here...

            context.Person.AddOrUpdate(p => p.Name,
            new Person { Name = "Joye.NET",Age=25 },
            new Person { Name = "Jerry.Core",Age=25 },
            new Person { Name = "longhao",Age=25 },
            new Person { Name = "xmm",Age=25 });
        }
    }
}

AngularJS 12

透过  工具 -> Nuget程序包管理器 – >
程序包管理器调节台, 默许项目供给选中FirstABP.EntityFramework,Add-Migration
“InitialCreate” 创设

AngularJS 13

Migrations文件夹下生成二个二〇一五051706081九叁_InitialCreate.cs文件

AngularJS 14

namespace FirstABP.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class InitialCreate : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.People",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(),
                        Age = c.Int(),
                    })
                .PrimaryKey(t => t.Id);

        }

        public override void Down()
        {
            DropTable("dbo.People");
        }
    }
}

AngularJS 15

继续实行“Update-Database”,会活动在数据库创造相应的数据表:

AngularJS 16

AngularJS, 

如若现身下图的标题,可能是Nuget版本太低,须求进步下,

AngularJS 17

AngularJS 18

 四、定义仓库储存接口

FirstABP.Core类库的people下新建IPersonRepository.cs

AngularJS 19

using System;
using System.Collections.Generic;
using Abp.Domain.Repositories;

namespace FirstABP.People
{
    public interface IPersonRepository : IRepository<Person,Int32>
    {
        List<Person> GetPersons();
    }
}

AngularJS 20

5、实现仓库储存接口

FirstABP.EntityFramework类库EntityFramework下的Repositories文件建PersonRepository.cs文件

AngularJS 21

using System;
using System.Collections.Generic;
using System.Linq;
using Abp.EntityFramework;
using FirstABP.People;

namespace FirstABP.EntityFramework.Repositories
{
    public class PersonRepository : FirstABPRepositoryBase<Person,Int32>,IPersonRepository
    {
        public PersonRepository(IDbContextProvider<FirstABPDbContext> dbContextProvider) : base(dbContextProvider)
        {
        }

        public List<Person> GetPersons()
        {
            //在仓储方法中,不用处理数据库连接、DbContext和数据事务,ABP框架会自动处理。
            //GetAll() 返回一个 IQueryable<T>接口类型
            var query = GetAll();
            return query.OrderByDescending(p=>p.Id).ToList();
        }
    }
}

AngularJS 22

6、成立世界服务(FirstABP.Application)

接口

AngularJS 23

using Abp.Application.Services;
using FirstABP.People.DTO;

namespace FirstABP.People
{
    public interface IPersonService : IApplicationService
    {
        GetAllPeopleOutput GetPersons();
    }
}

AngularJS 24

实现:

AngularJS 25

using System.Collections.Generic;
using Abp.Application.Services;
using AutoMapper;
using FirstABP.People.DTO;

namespace FirstABP.People
{
    public class PersonService : ApplicationService, IPersonService
    {
        private readonly IPersonRepository  _personRepository;

        /// <summary>
        /// 构造函数自动注入
        /// </summary>
        /// <param name="personRepository"></param>
        public PersonService(IPersonRepository personRepository)
        {
            _personRepository = personRepository;
        }

        public GetAllPeopleOutput GetPersons()
        {
            var persons = _personRepository.GetPersons();
            //用AutoMapper自动将List<Peopson>转换成List<PeopsonDto>
            return new GetAllPeopleOutput
            {
                People = Mapper.Map<List<PersonDto>>(persons)
            };
        }
    }
}

AngularJS 26

7、在web获取调用

代码:

AngularJS 27

using System.Web.Mvc;
using FirstABP.People;

namespace FirstABP.Web.Controllers
{
    public class HomeController : FirstABPControllerBase
    {
        private readonly IPersonService _personService;

        public HomeController(IPersonService personService)
        {
            _personService = personService;
        }

        public ActionResult Index()
        {
            //获取列表
            var p = _personService.GetPersons();

            return View("~/App/Main/views/layout/layout.cshtml"); //Layout of the angular application.
        }
    }
}

AngularJS 28

运作结果:

AngularJS 29

最终看看新扩展了那些代码:

AngularJS 30

代码下载:https://yunpan.cn/cSwC9CbNtDMFt  访问密码 78八c

深刻学习推荐到

阳铭种类教程:http://www.cnblogs.com/mienreal/p/4528470.html

tkb至简种类教程:http://www.cnblogs.com/farb/p/ABPTheory.html

相关文章