さて、最近私は読んだことがありますが、wikiページで「貧乏人のDI」と呼ばれる理由を理解するのが難しいです。悲しい事は、私が(=それを得ることはありません、まだwikiにすべての自分のページの上に行き、ある工場DIよりも問題(または一般的なIOCコンテナ)を理解できませんでしたか?
通常私はそうのようなDIを扱う工場のパターンで私のサービスクラスをラップします:。
public static class SomeTypeServiceFactory
{
public static SomeTypeService GetService()
{
SomeTypeRepository someTypeRepository = new SomeTypeRepository();
return = new SomeTypeService(someTypeRepository);
}
}
モジュールのような多くのことを思える私に:
各クラスは、それが具体的な実装にコンストラクタのBINDそれはモジュールとあなた関連付けられていますninjectコードが1つの以下のラインですが、私はただ見ていないのですだろうpublic class WarriorModule : NinjectModule {
public override void Load() {
Bind<IWeapon>().To<Sword>();
Bind<Samurai>().ToSelf().InSingletonScope();
}
}
。利点は、いつでもコンストラクタを追加/削除したり、インターフェイスコンストラクタの実装では、モジュールを工場と同じように変更する必要がありますか?だからここで優位を見ていない。
public static TServiceClass GetService<TServiceClass>()
where TServiceClass : class
{
TServiceClass serviceClass = null;
string repositoryName = typeof(TServiceClass).ToString().Replace("Service", "Repository");
Type repositoryType = Type.GetType(repositoryName);
if (repositoryType != null)
{
object repository = Activator.CreateInstance(repositoryType);
serviceClass = (TServiceClass)Activator.CreateInstance(typeof (TServiceClass), new[]{repository});
}
return serviceClass;
}
しかし、これは2つの理由のために安っぽいです:1)その命名規則に厳密に依存し、2)それは仮定
は、それから私は、私はそうのような一般的な慣習に基づく工場を考え出すことができると思いましたリポジトリは決してコンストラクタ(真ではない)を持たず、サービスの唯一のコンストラクタはそれに対応するrepo(真ではない)になります。私はと言っていました。「これはIoCコンテナを使用すべき場所ですね、ここは素晴らしいでしょう!これで私の研究が始まりました...しかし、私はそれを見ていないだけで、それを理解するのに苦労しています...
ninjectは、特定の宣言なしでクラスのコンストラクタを自動的に解決する方法はありますか私のジェネリック工場で使うのは素晴らしいです(私はリフレクションを使って手動で行うこともできますが、それはパフォーマンスヒットで、自分のページではリフレクションを使用しないと言っています)。
この問題についての啓蒙活動や、それが私のジェネリック工場でどのように使用されるかを示すことは、非常に高く評価されます。
EDIT:
public static class EntityServiceFactory
{
public static TServiceClass GetService<TServiceClass>()
where TServiceClass : class
{
IKernel kernel = new StandardKernel();
return kernel.Get<TServiceClass>();
}
}
すごい:I以下の説明のおかげで完全にninjectの素晴らしさを理解するために巧みだったと私の一般的な工場は、次のようになりますので、
回答。具象クラスは暗黙のバインディングを持っているので、すべてが自動的に処理されます。
通常の壊れたレコードのコメント:[私のマーク・シーマン.NET帳に依存性注入](http.commanning.com/seemann)に実行します。私はあなたがなぜDIとDIコンテナの所有権を1週間以内に持っているのか自信がないとは想像できません。 –