2011-07-09 6 views
1

コンストラクタインジェクションのためにNinjectを使用して、その場でコンクリートオブジェクトを作成しています。しかし、クラスには文字列を受け入れるメソッドが含まれているシナリオがあります。文字列の値に基づいて、私は特定のクラスを取得したいと思います。具体的なクラスを返すためのファクトリクラスを作成することでこれを達成しましたが、これが最善の方法であるかどうかはわかりませんでした。助言がありますか?このシナリオに依存性注入はどのように適用されますか?

//Service class 
public int GetEmployeeVacationDays(string employeeType) 
{ 
    IEmployee employee = EmployeeFactory.CreateEmployee(employeeType); 
    return employee.VacationDays(); 
} 

//Factory class 
public static IEmployee CreateEmployee(string employeeType) 
{ 
    if(employeeType == "Salary") 
    { 
     return new SalariedEmployee(); 
    } 
    else 
    { 
     return new HourlyEmployee(); 
    } 
} 

答えて

3

依存性注入は、シナリオには適用されません。それが工場のパターンです。 Ninjectは、特定のオブジェクトの場合に依存関係を提供するためにファクトリパターンを使用するように設定できます。実際に

という名前のバインディングを持つ工場出荷時のパターンを全体置き換えることができます:

はEmployeeTypeは、有効なクラス名であることを仮定し
Bind<IEmployee>().To<FooEmployee>().Named("foo"); 
Bind<IEmployee>().To<BarEmployee>().Named("bar"); 
Bind<IEmployee>().To<BazEmployee>().Named("baz"); 
+0

わかりましたので、私は実装しています工場出荷時のパターンがありますじゃ、はい。あなたのバインディングの例では、コンストラクタ・インジェクションにしか使用していないので、私は完全にはわかりません。私のコードはクラス内の特定のメソッドです。 – Mike

+0

@Beavis、はい、工場のパターンは問題ありません。 –

2

return System.Activator.CreateInstance(Type.GetType(className)) 
+0

employeeTypeは文字列です。 – Mike

+0

[GetType](http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx)は文字列を受け取ります。だから 'Class Test {...}'のようにemployeeTypeは '' Test "'でなければなりません。それは私が言っていることです。 – Joe

関連する問題