1. 程式人生 > >C# ABP - 創建自己的模塊

C# ABP - 創建自己的模塊

face 版本 bottom spl num mvc word webapi esp

本篇文章介紹怎麽創建自己的模塊,並且使用依賴註入方法進行模塊間的無縫結合。

我們創建一下自己的一個會員模塊,針對不同的系統都可以用。你們可以看看我是怎麽做的,或者從中得到啟發。

目錄

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/

C# ABP - 創建自己的模塊