C# ABP - 创建自己的模块

本篇文章介绍怎么创建自己的模块,并且使用依赖注入方法进行模块间的无缝结合。

我们创建一下自己的一个会员模块,针对不同的系统都可以用。你们可以看看我是怎么做的,或者从中得到启发。

目录

1.开始创建项目

2.新建自己的模块

1)引入类库

2)创建模块类

3)创建实体类与仓储

4)创建service类

5)创建对外用的类(接口)

3.其他模块调用会员模块

1.开始创建项目

首先,我们到ABP官网上下载一个MVC NLayered的解决方案。项目名字叫TestMember

具体怎么下载网上很多资料,这里不一一介绍。

2.新建自己的模块

下载完项目之后,我们新建一个类库,名字叫ClassLibraryMember。用户我们的会员模块。

创建完成之后,如下:

1)引入类库

Install-Package Abp -Version 2.0.2
Install-Package Abp.Zero -Version 2.0.1

当然,你也可以引入自己想要的版本。我们这里用到Zero模块,你也可以不用。

2)创建模块类

首先我们要创建一个模块类,因为ABP是用模块方式的架构来解耦的。模块之间有依赖性,A模块可以依赖于B模块,B模块依赖于A模块。

模块是怎么工作的呢?

我们可以看到,在Web模块里面,有个模块类,叫XXXWebModule,在App_Start文件夹下。在类的上面,有模块的所有依赖:

   [DependsOn(
        typeof(AbpWebMvcModule),
        typeof(TestMemberDataModule),
        typeof(TestMemberApplicationModule),
        typeof(TestMemberWebApiModule),
        typeof(ClassLibraryMember.ClassLibraryMemberModule))]
    public class TestMemberWebModule : AbpModule

ClassLibraryMemberModule模块是作者自己添加进去的,后面再做阐述。

我们看到,首先依赖于AbpWebMvcModule模块,此模块是ABP写的。

然后依赖于TestMemberDataModule模块,此模块是EntityFramework模块的模块类。

然后依赖于TestMemberApplicationModule模块,此模块是Application模块的模块类。

再依赖于TestMemberWebApiModule模块,此模块是WebApi模块的模块类。

最后是自己的模块类(会员模块)ClassLibraryMemberModule。

本次关于模块的调用关系先介绍到这里,有深入兴趣的话,可以看此文章 http://www.cnblogs.com/huaizuo/p/4836853.html

现在,我们创建自己的模块类,叫ClassLibraryMemberModule,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Abp.Dependency;
using Abp.Modules;

namespace ClassLibraryMember
{
    public class ClassLibraryMemberModule:AbpModule
    {

        //
        // 摘要:
        //     This method is used to register dependencies for this module.
        public override void Initialize()
        {
            //这行代码的写法基本上是不变的。它的作用是把当前程序集的特定类或接口注册到依赖注入容器中。
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        }
        //
        // 摘要:
        //     This method is called lastly on application startup.
        public override void PostInitialize()
        {

        }
        //
        // 摘要:
        //     This is the first event called on application startup. Codes can be placed here
        //     to run before dependency injection registrations.
        public override void PreInitialize()
        {

        }
        //
        // 摘要:
        //     This method is called when the application is being shutdown.
        public override void Shutdown()
        {

        }

    }
}

可以看到,我们的会员模块,暂时没依赖到其他模块。

这行代码的写法基本上是不变的。它的作用是把当前程序集的特定类或接口注册到依赖注入容器中:

IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());

到此我们的模块以及创建成功了。

我们在梳理一下模块的内部调用顺序:

假如模块A依赖于模块B,在项目启动时则运行方法顺序如下:

模块B的PreInitialize –> 模块A的PreInitialize

模块B的Initialize —> 模块A的Initialize

模块B的PostInitialize—> 模块A的PostInitialize

如果项目停止,则:

模块B的Shutdown—> 模块A的Shutdown

3)创建实体类与仓储

我们创建一个实体Member,继承AbpUser,如下:

using System.ComponentModel.DataAnnotations.Schema;
using Abp.Authorization.Users;
using Abp.Domain.Entities;
using Abp.Domain.Entities.Auditing;

namespace ClassLibraryMember.Entity
{
    [Table("Member")]
    public class Member: AbpUser<Member>
    {

        public string Token { get; set; }

        public string IdentityType { get; set; }

        public string Identifier { get; set; }

    }
}

即使我们创建了实体类,并且写了Table注解,但是怎么才能在新建数据库的时候才能把此表加入到数据库中呢?

所以我们找到EntityFramework中的类XXXDbContext。在此类中,建一个会员类的属性:

public virtual IDbSet<ClassLibraryMember.Entity.Member> Members { get; set; }

最后,我们运行数据库的创建,就能创建Member表了。如下:

4)创建service类

上面我们创建了实体类与数据库,但是怎么实现数据库的CRUD操作呢?

我们写一个会员的service,分别为接口IMemberService,实现类MemberService

在MemberService类中,我们要继承DomainService,此类是用来所有自己创建的domain services用到的。

当我们继承了此类时,有几个好处:

1)自动实例化(依赖注入)

2)继承了AbpServiceBase,此类实现了很多通用的方法,我们都可以用到

为什么继承DomainService会自动实例化呢?因为DomainService继承了ITransientDependency。ABP会扫所有类,如果继承了ITransientDependency,会自动实例化。

接口代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Abp.Dependency;
using Abp.Domain.Services;

namespace ClassLibraryMember.Core
{
    public interface IMemberService
    {
        void MemberToDo();

    }
}

类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Abp.Domain.Repositories;
using Abp.Domain.Services;
using Abp.Domain.Uow;
using ClassLibraryMember.Entity;

namespace ClassLibraryMember.Core
{
    public class MemberService:DomainService,IMemberService
    {

        private readonly IRepository<Member, long> _memberRepository;

        public MemberService()
        {
        }

        public MemberService(IRepository<Member, long> memberRepository)
        {
            _memberRepository = memberRepository;
        }

        public void MemberToDo()
        {
            try
            {
                Console.WriteLine("MemberService MemberToDo");
                _memberRepository.Insert(new Member()
                {
                    Identifier = Guid.NewGuid().ToString(),
                    IdentityType = "Token",
                    Token = Guid.NewGuid().ToString().Substring(10, 5),
                    EmailAddress = "11",
                    Name = "22",
                    Surname = "33",
                    UserName = "44",
                    Password = "55fddfgfdgd544",
                    AccessFailedCount = 1,
                    IsLockoutEnabled = false,
                    IsPhoneNumberConfirmed = true,
                    IsTwoFactorEnabled = true,
                    IsEmailConfirmed = true,
                    IsActive = true,
                    IsDeleted = false,
                    CreationTime = DateTime.Now
                });
                CurrentUnitOfWork.SaveChanges();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }

        }

    }
}

5)创建对外用的类(接口)

上面我们创建了实体,并且实现了逻辑。我们这个会员模块要其他人也可以用,所以我们要创建IMemberClient接口,并且继承ITransientDependency,因为要用到依赖注入:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Abp.Dependency;

namespace ClassLibraryMember.ServicesClient
{
    public interface IMemberClient: ITransientDependency
    {

        void ToDo();

    }
}

在创建它的实现类,MemberClient。此类有一个IMemberService的属性,也是注入的方式。

using ClassLibraryMember.Core;

namespace ClassLibraryMember.ServicesClient
{
    public class MemberClient:IMemberClient
    {
        private IMemberService _memberService;

        public MemberClient()
        {
        }

        public MemberClient(IMemberService memberService)
        {
            _memberService = memberService;
        }

        public void ToDo()
        {
            _memberService.MemberToDo();
        }

    }
}

到此,创建自己的类库已经完毕。

那外面怎么用呢,下面开始介绍。

3.其他模块调用会员模块

1)首先,在Web模块里面,Web的模块类里面,添加对会员模块的依赖。

[DependsOn(
        typeof(AbpWebMvcModule),
        typeof(TestMemberDataModule),
        typeof(TestMemberApplicationModule),
        typeof(TestMemberWebApiModule),
        typeof(ClassLibraryMember.ClassLibraryMemberModule))]
    public class TestMemberWebModule : AbpModule

2)然后在EntityFramework仓储里面,添加对Member的实体的创建

public virtual IDbSet<ClassLibraryMember.Entity.Member> Members { get; set; }

3)最后,开始调用。

我们这里从Application模块层里面调用。

首先要实现对IMemberClient的构造器注入,然后调用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Abp.Dependency;
using Abp.Domain.Repositories;
using ClassLibraryMember.ServicesClient;
using TestMember.Entity;

namespace TestMember.Services
{
    public class TestAppService:  ITestAppService
    {

        private readonly IMemberClient _iMemberClient;

        public TestAppService() { }

        public TestAppService(IMemberClient iMemberClient)
        {
            _iMemberClient = iMemberClient;
        }

        public void Test1()
        {
            _iMemberClient.ToDo();
        }

    }
}

到此,调用与测试都完毕,你们可以从GitHub中下载此demo:

https://github.com/cjt321/TestMember/

时间: 2024-10-28 18:50:21

C# ABP - 创建自己的模块的相关文章

【ABP框架系列学习】模块系统(4)

0.引言 ABP提供了构建模块和通过组合模块以创建应用程序的基础设施.一个模块可以依赖于另外一个模块.通常,程序集可以认为是模块.如果创建多个程序集的应用程序,建议为每个程序集创建模块定义. 当前,模块系统主要集中在服务器,而不是客户端. 1.模块定义 模块是从ABP包中的AbpModule派生的类定义的.比如说开发一个可以用于不同应用程序的博客模块(Blog Module).最简单的模块定义如下 : public class MyBlogApplicationModule : AbpModul

OFBiz进阶之HelloWorld(一)创建热部署模块

创建热部署模块 参考文档 https://cwiki.apache.org/confluence/display/OFBIZ/OFBiz+Tutorial+-+A+Beginners+Development+Guide 1 在目录hot-deploy下创建目录practice(即为要创建的模块名称) 2 在目录hot-deploy/practice下创建文件ofbiz-component.xml 1 <?xml version="1.0" encoding="UTF-8

JavaScript基础对象创建模式之模块模式(Module Pattern)(025)

模块模式可以提供软件架构,为不断增长的代码提供组织形式.JavaScript没有提供package的语言表示,但我们可以通过模块模式来分解并组织 代码块,这些黑盒的代码块内的功能可以根据不断变化的软件需求而不断的被添加,替代和删除.模块模式由几种我们已经介绍过的模式共同组成: 命名空间模式 即时函数模式 私有成员与访问控制方法模式 依赖声明模式 模块模式的第一步是建立一个命名空间.首先我们用先前介绍的namespace()方法创建一个工具模块例子,这个例子模块提供一些数组功能: MYAPP.na

npm创建和发布模块

今天项目需要使用npm去创建一个模块,然后我查询了了npm的使用文档(Working with private modules),然后对其进行了整理. 一.在操作之前,我们首先要将npm装好,并且登录(没有npm账号的需要先去注册一个帐号). 命令: $sudo npm install -g npm $npm login (npm logout 是退出,如果你不确定是否已经登录,你可以先试用此命令退出,然后重新登录) 二.创建一个文件夹 命令: $mkdir npmexample $cd npm

从头开始编写一个Orchard网上商店模块(3) - 创建Orchard.Webshop模块项目

原文地址:http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-3创建Orchard.Webshop模块项目 这是从头开始编写一个新的Orchard模块的教程的第3篇.对于本教程的概述,请参阅介绍. Orchard模块是一个真正的ASP.NET MVC的Area类库,同时遵循了ASP.NET MVC和Orchard的特定的规范.Orchard 规范提升了您的

ABP创建项目,生成解决方案

ABP创建项目,生成解决方案: 一直想尝试下ABP做项目,但一直还没去了解DDD,所以看起代码来比较吃力,所以在看DDD的同时,尝试了下在官网创建个以前做的项目,想着先运行看下效果. 官网现在创建项目生成的项目使用的.net 4.6.1,本地只装了4.5,于是尝试降版本.果然出了很多调用异常的错误,于是开始一步一步的调试,调试了半天,发现ABP 的底层依赖的.net 4.6.1. 所以,那就开始装.net 4.6.1.完成安装,启动项目,生成成功. ok,第一步算是先尝试了一把,后面等DDD看完

使用IntelliJ IDEA 12创建Maven多模块项目

使用Maven管理项目时,往往需要创建多个模块,模块之间存在相互引用的关系.对于Maven的依赖,也需要专门创建一个模块来管理依赖项.例如对于一个项目,可以创建一个config模块来管理Maven依赖项,创建一个common模块来管理POJO类,创建一个server来管理业务逻辑及数据库操作类,创建一个web模块来组织Web文件,如HTML,JSP等.下图是一个Maven多模块管理的案例项目结构: 简单说一下创建过程: 1.首先创建一个空项目:Demo,New Project对话框左侧选择Mav

SpringBoot创建maven多模块项目

SpringBoot创建maven多模块项目 项目结构 该项目名称为springboot-maven-multi,由springboot-maven-multi.user-dao.user-domain.user-service.user-web个模块组成,其中springboot-maven-multi模块是其他模块的父模块. 第一步:新建项目springboot-maven-multi File -> New -> Project -> Spring Initializr 如下图:输

IntelliJ IDEA在同一目录创建多个模块

在用IDEA开发工具进行实际开发中,往往会将一个项目分为多个模块来进行,就像把一个大项目分割为几个小项目,下面主要来演示如何在同一目录创建多个模块. 1.首先新建一个空的Project 2.这里选择“Empty Project”,接着选择“Next” 3.填写项目信息,点击“Finish” 4.让IDEA左边导航栏贴到左边,“设置”--“Floating Mode” 5.在现在建好的项目里面新建新的模块,有以下方法: 5.1 5.2   6.这里我们建立Maven项目 7.我们再次按照上述步骤建