>

중개, 주가, 관리자 요금 및 기타 요금을 계산하기 위해 4 가지 구성 요소가있는 복잡한 계산기 논리를 작성해야합니다. 각기 다른 논리와 공식이 있습니다.

따라서 Unity DI를 사용하기로 결정했습니다. TotalAnnualCostCalculator 생성자에서 아래와 같이 IChargeCalculator 인터페이스를 구현하는 모든 클래스를 해결하는 ContainerFactoryClass가 있습니다.

public class TotalAnnualCostCalculator
{
    private readonly IUnityContainer container;
   //Constructor
    public TotalAnnualCostCalculator()
    {
        container = ContainerFactory.InitializeContainer();
        ContainerFactory.SetupContainer(container);
    }
    public AnnualCostCharges CalculateTotalAnnualCost(Parameters product)
    {
          var calculators = container.ResolveAll<ICalculator>().ToList();
          // Invoke calcualtion method
           Parallel.ForEach(calculators, c =>
        {
            return c.CalculateAnnualCost(product);
        });
    }
}

컨테이너 팩토리 클래스 :-

public static class ContainerFactory
{
    public static IUnityContainer Container { get; private set; }
    public static IUnityContainer InitializeContainer()
    {
        var container = new UnityContainer();
        RegisterDependencies(container);
        return container;
    }
    private static void RegisterDependencies(UnityContainer container)
    {
        container.RegisterType<ICalculatorStrategyFactory, CalculatorStrategyFactory>("Factory");
        container.RegisterType<IEffectiveAnnualCostCalculator, InvestmentManagementChargeCalculator>("IMCChargeCalculator",
            new InjectionConstructor(new ResolvedParameter<ICalculatorStrategyFactory>("Factory")));
        //container.RegisterType<IEffectiveAnnualCostCalculator, AdministrationChargeCalculator>("AdministrationChargeCalculator");
        container.RegisterType<IEffectiveAnnualCostCalculator, AdviceChargeCalculator>("AdviceChargeCalculator");
        container.RegisterType<IEffectiveAnnualCostCalculator, OtherChargeCalculator>("OtherChargeCalculator");
        container.RegisterType<IInvestmentManagementChargeCalculator, LumpSumIMCCalculator>("LumpSumIMCCalculator");
        container.RegisterType<IInvestmentManagementChargeCalculator, DebitOrderIMCCalculator>("DebitOrderIMCCalculator");
    }
    public static void SetupContainer(IUnityContainer container)
    {
        Container = container;
    }
}

모든 API는 TotalAnnualCostCalculator의 인스턴스를 생성하고 이와 같은 메소드를 호출하여 Calculator.dll을 사용합니다.

var totalCharges = calc.CalculateTotalAnnualCost(prod);

내 코드 검토자는 Unity 패턴과 밀접하게 결합 된 팩토리 패턴을 사용하는 것이 좋습니다

알려주세요

  • 답변 # 1

    실제로 DI 컨테이너를 전혀 사용하지 마십시오. Steven이 의견에서 제안한 것처럼, 이것은 Composite에 매우 적합합니다.

    public class TotalAnnualCostCalculator : ICalculator
    {
        private readonly ICalculator[] calculators;
        public TotalAnnualCostCalculator(params ICalculator[] calculators)
        {
            this.calculators = calculators;
        }
        public AnnualCostCharges CalculateTotalAnnualCost(Parameters product)
        {
            Parallel.ForEach(this.calculators, c => c.CalculateAnnualCost(product));
        }
    }
    
    

    컴포지션 루트에서 간단히 new  모든 ICalculator 를  사용하려는 객체를 TotalAnnualCostCalculator 의 생성자에게 전달하십시오. .

  • 답변 # 2

    모든 IEffectiveAnnualCostCalculator (또는 인터페이스)를 등록하십시오. 열거 형을 동일한 유형의 배열에 매핑하면됩니다.

    container.RegisterType<IEnumerable<IEffectiveAnnualCostCalculator>, IEffectiveAnnualCostCalculator[]>();
    
    

    의존성 주입으로 해결 :

    private IEnumerable<IEffectiveAnnualCostCalculator> calculators;
     public TotalAnnualCostCalculator(IEnumerable<IEffectiveAnnualCostCalculator> calculators)
     {
         this.calculators = calculators;
     }
    public AnnualCostCharges CalculateTotalAnnualCost(Parameters product)
    {
        Parallel.ForEach(this.calculators, c => c.CalculateAnnualCost(product));
    }
    
    

관련 자료

  • 이전 angular - 목록 변경의 영향을받는 항목 만 반환하는 valueChanges ()
  • 다음 java - 기계적 인조 인간 - sqlite에서 중복 삽입 데이터 방지