策略/工厂模式正确使用

问题描述

问题

我有一个要填充的员工模型。为此,它涉及在满足某些条件的情况下跨多个客户端调用多个端点。我正在寻找一种应用模式,它将多个 if 语句整理成更简洁和可扩展的东西。我已经使用策略和工厂模式的混合来接近它。

  1. 将如此多的依赖项 DI 到工厂是否会使其成为一种反模式?

  2. 如果策略本身被直接导入工厂,那么在创建后将数据传递给它们是否打破了策略模式?在这种情况下员工,employeeModel

原始代码

var employee = await employeeClient.GetEmployeeAsync(id);
var employeeModel = mapper.Map<EmployeeModel>(employee);

if(employee.CertificationIds.Count() > 0)
{
   var certifications = await employeeClient.GetCertificationsAsync(employee.CertificationIds);
   certifications.ForEach(c => employeeModel.Certifications.Add(mapper.Map<CertificationModel>(c)));
}

if(employee.ImageId ! = null)
{
   var empImage = await employeeMediaClient.GetEmployeeImageAsync(employee.ImageId);
   employeeModel.Image = mapper.Map<ImageModel>(empImage);
}

if(employee.EmploymentActive)
{
    var latestSalarySlip = await companyFinancialClient.GetLatestEmployeeSalarySlipAsync(employee.Id);
    employeeModel.LatestSalarySlip = mapper.Map<ImageModel>(latestSalarySlip);
}

if(employee.SchemeId != null)
{
    var schemeDetails = await schemeClient.GetSchemeAsync(employee.SchemeId);

        if(schemeDetails.CompanyFinancing)
        {
            var schemeFinancialDetails = await companySchemesClient.GetFinancialDetails(schemeDetails.Id)
        }
        if(schemeDetails.StateFinancing)
        {
            var schemeFinancialDetails = await stateSchemesClient.GetFinancialDetails(schemeDetails.Id)
        }

    employeeModel.Scheme = mapper.Map<SchemeModel>(schemeDetails);
    employeeModel.Scheme.FinancialDetails = mapper.Map<SchemeFinancialDetails>(schemeFinancialDetails);        
}

return employeeModel

转换后的代码

  var employee = await employeeClient.GetEmployeeAsync(id);
  var employeeModel = mapper.Map<EmployeeModel>(employee);
  var strategies = employeeStrategyFactory.Create(employeeModel,employee);
  strategyExecutor.Execute(strategies);

EmployeeStrategyFactory

public EmployeeStrategyFactory(IMapper mapper,EmployeeClient employeeClient,EmployeeMediaClient employeeMediaClient,CompanyFinancialClient companyFinancialClient,SchemeClient schemeClient,CompanySchemesClient companySchemesClient,StateSchemesClient stateSchemesClient,IGetEmployeeCertsStrategy getEmployeeCertsStrategy,IGetEmployeeMediaStrategy getEmployeeMediaStrategy,IGetEmployeeSalaryStrategy getEmployeeSalaryStrategy,IGetEmployeeSchemeDetails getEmployeeSchemeDetails)
{
   ...
}

public List<IPopulateEmployeeStrategy> GetStrategies(EmployeeModel empModel,Employee emp)
{
    if(emp.CertificationIds.Count() > 0)
    {
      employeeMediaClient.Employee = emp;
      employeeMediaClient.EmployeeModel = empModel;
      strategies.Add(employeeMediaClient)
    }
    ....
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)