まず、Ninjectを新しくしましたが、この質問はNinjectを対象としていますが、一般的にDIに当てはまるようです。Ninjectを使ってサービスを設定する
ここに何か不足していると思います。これまでに提案されたソリューションはすべて、ひどく複雑なようです。
私はこのようなものだった:
public class MyController : Controller
{
private IMyService _Service;
public MyController()
:this(null)
{ }
public MyController(IMyService service)
{
_Service = service ?? new MyService(ModelState);
}
}
public IMyService
{}
public class MyService : IMyService
{
private ModelStateDictionary _Model;
public MyService(ModelStateDictionary model)
{
_Model = model;
}
}
をそして私は、私はそれにNinjectを行くだろうと思っていました。そして、この思い付いた:
public class MyController : Controller
{
private IMyService _Service;
public MyController()
:this(null)
{
_Service = Locator.Kernel.Get<IMyService>(new Ninject.Parameters.ConstructorArgument("model", ModelState));
}
}
public class MyServiceModule : NinjectModule
{
public override Load()
{
Bind<IMyService>().To<MyService>(); //here
}
}
それは、私はそれが結合ビット(ここではマーク)を変更することができるはずです、しかし私には思えるので、それはむしろ私が欲しいときよりも、にModelStateを取得するには、その時点で知っています具体的なサービスクラスの事前知識が必要なコンストラクタのインスタンス。
私は不必要に心配していますか、これを行う良い方法がありますか?
サイモン
私はあなたがバインド().TOを()を実行するとき、あなたは.WithParameterを追加することができると思います(新しいNinject.Parameters.ConstructorArgument())それはあなたが持っているように...私はまだ私のプロジェクトでは得られていないので、確かに。 –
また、コンストラクタを介してIMyServiceをMyControllerに注入する必要があります。 Ninject.Web.MVCプロジェクトはこれを簡単に実行できるコントローラファクトリを提供します。一般に、カーネルから手作業で取り出してしまうと、IMHOの設計に何か問題がある可能性があります。 – Brook
これは私が最後にやったのと同じアプローチです。私はコンストラクタインジェクションの後にModelStateをプロパティに渡しました。 –