简化 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());
}
我是依赖注入和 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());
}