简化 Unity Container Resolve 表达式

simplify Unity Container Resolve expression

我是依赖注入和 Microsoft Unity IoC 的新手。我的场景如下:

员工-Class:

class Employee
{
    private readonly ISalaryCalculation _salaryCalculationCalculator;

    public Employee(ISalaryCalculation salaryCalculationCalculator)
    {
        _salaryCalculationCalculator = salaryCalculationCalculator;
        BaseSalary = 42;
    }

    public string Firstname { get; set; }

    public string Lastname { get; set; }

    public int Age { get; set; }

    public int BaseSalary { get; set; }

    public int CalcSalary()
    {
        return _salaryCalculationCalculator.CalcSalary(BaseSalary);
    }
}

我的 SalaryCalculation 接口有两种不同的实现方式

interface ISalaryCalculation
{
    int CalcSalary(int baseSalary);
}

我的 Unity 设置是:

static void Main(string[] args)
{
    UnityContainer unityContainer = new UnityContainer();
    unityContainer.RegisterType<Employee>();

    unityContainer.RegisterType<ISalaryCalculation, BossSalaryCalculation>("Boss");
    unityContainer.RegisterType<ISalaryCalculation, NormalSalaryCalculation>("Normal");

    var employee = unityContainer.Resolve<Employee>(new DependencyOverride(typeof(ISalaryCalculation),unityContainer.Resolve<ISalaryCalculation>("Boss")));
    Console.WriteLine(employee.CalcSalary());
}

有没有更聪明的方法来使用 Unity 来实现这个目标?因为每当我实例化一个新的 Employee 时,我都必须传递它的 salaryCalculation 逻辑。

根据某些条件,您只能注册一个实现:

static void Main(string[] args)
{
    UnityContainer unityContainer = new UnityContainer();
    unityContainer.RegisterType<Employee>();

    if (someCondition)
    {
        unityContainer.RegisterType<ISalaryCalculation, BossSalaryCalculation>("Boss");
    }
    else
    {
        unityContainer.RegisterType<ISalaryCalculation, NormalSalaryCalculation>("Normal");
    }
    var employee = unityContainer.Resolve<Employee>();
    Console.WriteLine(employee.CalcSalary());
}

另一种方法 - 使用 ResolvedParameter:

static void Main(string[] args)
{
    UnityContainer unityContainer = new UnityContainer();
    unityContainer.RegisterType<Employee>();

    unityContainer.RegisterType<ISalaryCalculation, BossSalaryCalculation>("Boss");
    unityContainer.RegisterType<ISalaryCalculation, NormalSalaryCalculation>("Normal");

    var employee = unityContainer.Resolve<Employee>(new ParameterOverride("salaryCalculationCalculator", new ResolvedParameter<ISalaryCalculation>("Boss")));
    Console.WriteLine(employee.CalcSalary());
}