私は日々の開発にDependency InjectionとInversion of Controlを適用したいと思います。オブジェクトタイプがSomeObject
(インターフェイスISomeObject
を実装しています)とします。私はIData
インターフェイスを実装するDataというこのオブジェクトを消費するクラスを持っています。Inversion of Controlのパラダイムを使用してカスタムオブジェクトのリストを作成
public interface ISomeObject {
int ID;
string Name;
bool IsAwesome;
void DoSomeStuffIfAwesome();
}
public Class SomeObject : ISomeObject {
int ID;
string Name;
bool IsAwesome;
void DoSomeStuffIfAwesome() { /*stuff happens here*/ }
}
public interface IData {
List<ISomeObject> GetSomeObjects();
}
public Class Data : IData {
List<ISomeObject> GetSomeObjects()
{
List<ISomeObject> objects = new List<ISomeObject>; // ??? Maybe and cast later?
//do some SQL stuff and get a SqlDataReader object called reader
while(reader.Read()) {
//ISomeObject someObj = ???
//Read into the someObj.ID, someObj.Name and someObj.IsAwesome fields
objects.add(someObj);
}
return objects;
}
}
GetSomeObjects()
方法はISomeObject
オブジェクトのリストを生成します。しかし、Data.cs
にはSomeObject
に関連するものをハードコードしたくありません。私は実行時に問題を解決するために何らかの形のDependency Injectionが必要です。これを処理する最善の方法は何ですか?私は以下を考慮しました:
1. Data
のコンストラクタにSomeObject
のインスタンスを渡します。この方法で私は.GetType()
の型を得ることができます。それをData.cs
の変数System.Type
に格納し、ループにActivator.CreateInstance
を使用してリストに追加する新しいオブジェクトを作成します。 Data
は、正しく理解すれば、特にキャストするSomeObject
クラスについて知る必要があります。
2.
はData
のコンストラクタに私のIoCコンテナのインスタンスを渡すだけ
container.Resolve<ISomeObject>()
を使用してオブジェクトの種類を解決します。これは私のIoCコンテナを利用することなくユニットテストの
GetSomeObjects()
メソッドを難しくするでしょう。私は単体テスト時にIoCコンテナを利用すべきではなく、必要なものを手作業でメソッドに渡すべきだと読んだことがあります。
3.パスとしてインスタンス化されてきたISomeObject
オブジェクトSomeObject
- 私はそのようなSomeObject.GenerateList(IDataReader reader)
などの方法で構築されたいくつかの、経由してオブジェクトを作成することを使用します。
ある時点で、クラスは具体的でなければなりません。なぜ、** IData'の**実装で、特定の 'ISomeObject'オブジェクトのセットを返すことができないのですか? –
それは非常によく状況になる可能性があります。私の理解はIoCとDependency Injectionの目標でした。コンシューマにコンセプトを教えてもらうことだけでしたので、コンシューマクラスをすばやく交換する必要はありません。ですから、将来SomeObjectをISomeObjectを実装する別のクラスに置き換えたい場合は、Data.cに触れることなくそれを行うことができます。 私は抽象化のアイデアが深すぎて、少し元気づける必要があります。おそらく私はData.csでSomeObjectをインスタンス化する必要があります – user1548103
リーダーを取り、 'ISomeObject'を返すファクトリ(' ISomeObjectFactory')を使用してください。データをファクトリに挿入すると、ファクトリは 'ISomeObject'の構築方法を知ります。 – Nkosi