2015-10-03 46 views
1

我是新的依賴注入和Microsoft Unity IoC。我的情況是follwing:簡化Unity容器解析表達式

員工級:

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); 
} 

我統一設置爲:

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邏輯。

回答

0

您可以根據一定條件下只註冊一個實現:

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()); 
}