原文: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:


