Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 策略/工厂模式正确使用_C#_Factory Pattern_Strategy Pattern - Fatal编程技术网

C# 策略/工厂模式正确使用

C# 策略/工厂模式正确使用,c#,factory-pattern,strategy-pattern,C#,Factory Pattern,Strategy Pattern,问题 我有一个雇员模型,我正在寻找填充。要做到这一点,需要在满足某些条件的情况下跨多个客户端调用多个端点。我正在寻找一种模式来应用,它可以将多个if语句整理成更简洁和可扩展的内容。我采用了战略和工厂模式的混合方式 工厂中有这么多依赖项,这是否会成为一种反模式 如果这些策略本身被导入工厂,那么在创建后将数据传递给它们是否会打破策略模式?在本例中为employee,employeeModel 原始代码 var employee = await employeeClient.GetEmployee

问题

我有一个雇员模型,我正在寻找填充。要做到这一点,需要在满足某些条件的情况下跨多个客户端调用多个端点。我正在寻找一种模式来应用,它可以将多个if语句整理成更简洁和可扩展的内容。我采用了战略和工厂模式的混合方式

  • 工厂中有这么多依赖项,这是否会成为一种反模式

  • 如果这些策略本身被导入工厂,那么在创建后将数据传递给它们是否会打破策略模式?在本例中为employee,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)
        }
        ....
    }
    
    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)
    }
    ....
    }