.net6+Volo.Abp实现简单业务策略模式


业务简介:根据请求参数PlatforyType类型实现调用不同的平台业务逻辑

该模式优点:符合开闭和单一原则,后端开发人员只需专注于每个平台的业务开发,如果一个平台业务改变,只需针对该平台进行调整;如果有新增平台业务,只需新增该平台业务实现,不需要调整整体代码

(注意:使用abp的批量注入模式时,接口名称跟实现接口的类名称要一致,例如,接口名称:IGetOrderInfo,实现类名称:EbayGetOrderInfo,必须包好接口名称,要不然无法注入容器)


简单实现流程
1,定义一个业务接口,接口包含PlatforyType类型和GetInfo方法
2,实现接口
3,定义一个工厂接口,接口包含GetInfo方法
4,实现工厂接口,Getinfo方法根据传入的PlatforyType类型调用不同平台业务

实现代码
1,定义业务接口
using Volo.Abp.DependencyInjection;

namespace WebApplication7.IServices
{
public interface IGetOrderInfo:ITransientDependency
{
int PlatforyType { get; }

string GetInfo();
}
}

 

2,实现接口
using WebApplication7.IServices;

namespace WebApplication7.Services
{
public class EbayGetOrderInfo : IGetOrderInfo
{
public int PlatforyType { get => 0; }

public string GetInfo()
{
var name = "ebay";

return name;
}
}
}

using WebApplication7.IServices;

namespace WebApplication7.Services
{
public class AmazonGetOrderInfo : IGetOrderInfo
{
public int PlatforyType { get => 1; }

public string GetInfo()
{
var name = "amazon";

return name;
}
}
}

 

3,定义一个工厂接口,接口包含GetInfo方法

using Volo.Abp.DependencyInjection;

namespace WebApplication7.Factory
{
public interface IFactory:ITransientDependency
{
string GetInfo(int platformType);
}
}

 

4,实现工厂接口,Getinfo方法根据传入的PlatforyType类型调用不同平台业务
using Volo.Abp.Modularity;
using WebApplication7.IServices;

namespace WebApplication7.Factory
{
public class GetOrderInfoFactory : IFactory
{
IEnumerable<IGetOrderInfo> _list;
public GetOrderInfoFactory(IEnumerable<IGetOrderInfo> list)
{
_list = list;
}

public string GetInfo(int platformType)
{
var client = _list.FirstOrDefault(w => w.PlatforyType == platformType);
if(client == null)
{
return String.Empty;
}

return client.GetInfo();
}
}
}

 

5,实现批量注入
using Volo.Abp.Modularity;

namespace WebApplication7.Model
{
public class ServiceModel:AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{

}
}
}

6,program添加配置
builder.Services.AddApplication<ServiceModel>();

7,实现请求接口
using Microsoft.AspNetCore.Mvc;
using WebApplication7.Factory;

namespace WebApplication7.Controllers
{
[ApiController]
public class TestController : ControllerBase
{
ElasticClientFactory _elasticClient;
ILogger _log;
IFactory _factory;

public TestController(ElasticClientFactory elasticClient, IFactory factory)
{
_elasticClient = elasticClient;
_factory = factory;
}

[HttpGet]
[Route("[controller]/TestGetOrderInfo")]
public ActionResult TestGetOrderInfo( int platformType = 0)
{
var info = _factory.GetInfo(platformType);
return Ok(info);
}

}
}

posted @ 2022-09-09 11:43  元点  阅读(424)  评论(0编辑  收藏  举报