私はMVC3、Entity Framework v4.3 Code First、およびSimpleInjectorを使用しています。私はこのように見えるいくつかの簡単なクラスを持っています:
public class SomeThing
{
public int Id { get; set; }
public string Name { get; set; }
}
次のような別のエンティティがあります。
public class MainClass
{
public int Id { get; set; }
public string Name { get; set; }
public virtual AThing AThingy { get; set; }
public virtual BThing BThingy { get; set; }
public virtual CThing CThingy { get; set; }
public virtual DThing DThingy { get; set; }
public virtual EThing EThingy { get; set; }
}
各Thingy(現在)には、次のような独自のManagerクラスがあります。
public class SomeThingManager
{
private readonly IMyRepository<SomeThing> MyRepository;
public SomeThingManager(IMyRepository<SomeThing> myRepository)
{
MyRepository = myRepository;
}
}
その結果、私のMainControllerは次のようになります。
public class MainController
{
private readonly IMainManager MainManager;
private readonly IAThingManager AThingManager;
private readonly IBThingManager BThingManager;
private readonly ICThingManager CThingManager;
private readonly IDThingManager DThingManager;
private readonly IEThingManager EThingManager;
public MainController(IMainManager mainManager, IAThingManager aThingManager, IBThingManager bThingManager, ICThingManager cThingManager, IDThingManager dThingManager, IEThingManager eThingManager)
{
MainManager = mainManager;
AThingManager = aThingManager;
BThingManager = bThingManager;
CThingManager = cThingManager;
DThingManager = dThingManager;
EThingManager = eThingManager;
}
...various ActionMethods...
}
実際には、このコントローラーには2倍の数の依存関係が注入されています。臭い。すべてまたはほとんど同じ依存関係を持つOtherControllerがあることも知っていると、匂いはさらに悪化します。リファクタリングしたい。
私はすでにDIについて十分に知っているので、プロパティインジェクションとサービスロケーターは良いアイデアではありません。
MainControllerは単一の画面であるため、これらすべてを表示して、1つの[保存]ボタンをクリックするだけで編集できるようにする必要があるため、MainControllerを分割できません。言い換えれば、単一の投稿アクションメソッドはすべてを保存します(ただし、それが単一の[保存]ボタンである限り、それが理にかなっている場合は変更してもかまいません)。この画面はKnockoutjsで構築されており、違いが生じる場合はAjaxの投稿とともに保存されます。
私はアンビエントコンテキストの使用をユーモアを交えましたが、それが正しい方法であるとは確信していません。私はファサードを注入することの使用もユーモアを交えました。また、この時点でコマンドアーキテクチャを実装する必要があるかどうかも疑問に思っています。(上記のすべてが匂いを別の場所に移動するだけではありませんか?)
最後に、おそらく上記の3つのアプローチとは関係なく、代わりに、GetAThings()、GetAThing(id)、GetBThings()、GetBThing(id)などの明示的なメソッドを持つLookupManagerを1つ持つ必要がありますか?(ただし、そのLookupManagerには、いくつかのリポジトリー、または新しいタイプのリポジトリーを挿入する必要があります。)
私の考えはさておき、私の質問は、繰り返しますが、このコードをリファクタリングして、注入された依存性の狂った数を減らすための良い方法は何ですか?