原文:https://blog.csdn.net/weixin_33675507/article/details/93288573
本篇文章介紹怎么創建自己的模塊,並且使用依賴注入方法進行模塊間的無縫結合。
我們創建一下自己的一個會員模塊,針對不同的系統都可以用。你們可以看看我是怎么做的,或者從中得到啟發。
目錄
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: