依赖ProductAppService并完成调用。
public class ProductServiceClient : IProductServiceClient { private readonly IProductAppService _productAppService; public ProductServiceClient(IProductAppService productAppService) { _productAppService = productAppService; } public async Task<int> GetProductId() { var productDto = await _productAppService.GetAsync(); return productDto.Value; } }在OrderAppService中依赖防腐层接口,并完成调用。
public class OrderAppService : OrderManagementAppService, IOrderAppService { private readonly IProductServiceClient _productServiceClient; public OrderAppService(IProductServiceClient productServiceClient) { _productServiceClient = productServiceClient; } public async Task<OrderDto> GetAsync() { var productId = await _productServiceClient.GetProductId(); ... } }这样一来,在防腐层实现中便可以使用到Product上下文的应用服务了,对于这个应用服务的请求是当前进程内的还是进程间的,由具体的承载方式而决定。
大单体承载将依照如下图,将三个模块承载到GravelService.Host上。
新建一个GravelService.Host的项目,采用WebApi类型即可。存放到microservices文件夹下,这样方便理解整个层级划分。
其次依赖一些基本的Nuget包,诸如ABP自身的及方便展示Api的Swagger。本次不考虑实体的创建,也就不考虑EF Core包的依赖了。
Volo.Abp
Volo.Abp.AspNetCore.MultiTenancy
Volo.Abp.AspNetCore.Mvc
Volo.Abp.Autofac
Swashbuckle.AspNetCore
引用各模块内的Application层及EntityFrameworkCore层。模仿着给定的微服务Demo,完成一波CV操作。增加一个类出来承担着服务与中间件的配置。
在其中依赖引用的各Application层及EntityFrameworkCore层中的Module,这样一来模块依赖就搞定了。
[DependsOn( typeof(AbpAutofacModule), typeof(AbpAspNetCoreMvcModule), typeof(AbpAspNetCoreMultiTenancyModule), typeof(CustomerManagementApplicationModule), typeof(CustomerManagementEntityFrameworkCoreModule), typeof(OrderManagementApplicationModule), typeof(OrderManagementEntityFrameworkCoreModule), typeof(ProductManagementApplicationModule), typeof(ProductManagementEntityFrameworkCoreModule) )] public class GravelServiceHostModule : AbpModule { ... }增加服务配置,将各模块中的应用服务动态转换成Api控制器。
Configure<AbpAspNetCoreMvcOptions>(options => { options.ConventionalControllers .Create(typeof(CustomerManagementApplicationModule).Assembly, opts => { opts.RootPath = "CustomerManagement"; }) .Create(typeof(OrderManagementApplicationModule).Assembly, opts => { opts.RootPath = "OrderManagement"; }) .Create(typeof(ProductManagementApplicationModule).Assembly, opts => { opts.RootPath = "ProductManagement"; }); });然后,启动即可,所有模块中的接口都承载到了该承载体中。
通过访问Order的api/OrderManagement/order接口获得返回的9527,也就验证了,防腐层内去访问Product上下文的应用服务。
此时是在同一进程内,使用到的是ProductAppService的具体实现,断点查看也可看出当前进程内的请求,依赖其他上下文服务的应用服务为ApplicationServiceProxy。
多服务承载依照如下图开始切换承载模式,只更改承载体,将一个大的承载体切分成各上下文独自承载体。
新建三个和GravelService.Host同等的WebApi项目。在GravelService.Host上裁剪即可,每个独立的承载体只拥有自身的上下文。