C# 策略/工厂模式正确使用
问题 我有一个雇员模型,我正在寻找填充。要做到这一点,需要在满足某些条件的情况下跨多个客户端调用多个端点。我正在寻找一种模式来应用,它可以将多个if语句整理成更简洁和可扩展的内容。我采用了战略和工厂模式的混合方式C# 策略/工厂模式正确使用,c#,factory-pattern,strategy-pattern,C#,Factory Pattern,Strategy Pattern,问题 我有一个雇员模型,我正在寻找填充。要做到这一点,需要在满足某些条件的情况下跨多个客户端调用多个端点。我正在寻找一种模式来应用,它可以将多个if语句整理成更简洁和可扩展的内容。我采用了战略和工厂模式的混合方式 工厂中有这么多依赖项,这是否会成为一种反模式 如果这些策略本身被导入工厂,那么在创建后将数据传递给它们是否会打破策略模式?在本例中为employee,employeeModel 原始代码 var employee = await employeeClient.GetEmployee
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)
}
....
}
var employee=await employeeClient.GetEmployeeAsync(id);
var employeeModel=mapper.Map(雇员);
if(employee.CertificationIds.Count()>0)
{
var certifications=await employeeClient.GetCertificationAsync(employee.CertificationId);
certifications.ForEach(c=>employeeModel.certifications.Add(mapper.Map(c));
}
if(employee.ImageId!=null)
{
var empImage=await employeeMediaClient.GetEmployeeImageAsync(employee.ImageId);
employeeModel.Image=mapper.Map(empImage);
}
if(employee.EmploymentActive)
{
var latestSalarySlip=await companyFinancialClient.GetLatestEmployeeSalarySlipAsync(employee.Id);
employeeModel.LatestSalarySlip=mapper.Map(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=等待状态SchemeClient.GetFinancialDetails(schemeDetails.Id)
}
employeeModel.Scheme=mapper.Map(schemeDetails);
employeeModel.Scheme.FinancialDetails=mapper.Map(schemeFinancialDetails);
}
返回雇员模型
转换代码
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)
}
....
}
var employee=await employeeClient.GetEmployeeAsync(id);
var employeeModel=mapper.Map(雇员);
var strategies=employeeStrategyFactory.Create(employeeModel,employee);
战略执行者。执行(战略);
员工战略工厂
公共员工战略工厂(IMapper、EmployeeClient、EmployeeClient、,
EmployeeMediaClient EmployeeMediaClient,
公司金融客户公司金融客户,
SchemeClient SchemeClient,CompanySchemeClient CompanySchemeClient,
StateSchemesClient StateSchemesClient,IGetTemployeeCertsStrategy getEmployeeCertsStrategy,
IGetEmployeeMediaStrategy getEmployeeMediaStrategy,
IGetEmployeeSalaryStrategy getEmployeeSalaryStrategy,
IGetEmployeeSchemeDetails getEmployeeSchemeDetails)
{
...
}
公共列表GetStrategies(员工模型emp模型、员工emp)
{
if(emp.CertificationId.Count()>0)
{
employeeMediaClient.Employee=emp;
employeeMediaClient.EmployeeModel=empModel;
策略。添加(employeeMediaClient)
}
....
}