2011-08-03 2 views
3

まず、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を取得するには、その時点で知っています具体的なサービスクラスの事前知識が必要なコンストラクタのインスタンス。

私は不必要に心配していますか、これを行う良い方法がありますか?

サイモン

+0

私はあなたがバインド().TOを()を実行するとき、あなたは.WithParameterを追加することができると思います(新しいNinject.Parameters.ConstructorArgument())それはあなたが持っているように...私はまだ私のプロジェクトでは得られていないので、確かに。 –

+0

また、コンストラクタを介してIMyServiceをMyControllerに注入する必要があります。 Ninject.Web.MVCプロジェクトはこれを簡単に実行できるコントローラファクトリを提供します。一般に、カーネルから手作業で取り出してしまうと、IMHOの設計に何か問題がある可能性があります。 – Brook

+0

これは私が最後にやったのと同じアプローチです。私はコンストラクタインジェクションの後にModelStateをプロパティに渡しました。 –

答えて

0

MyServiceが本当にModelStateDictionaryを構築する必要がありますか?

私はリファクタリングを検討しているので、Serviceクラスの構築ではなく、私が呼び出していたメソッドにModelStateDictionaryを渡していました。

なリファクタリングが不合理である場合、あなたはおそらくModelStateDictionary

public interface IModelStateProvider { 
    ModelStateDictionary GetModelState(); 
} 

の上に抽象化レイヤーを追加し、セットアップが結合、現在のコンテキストのModelStateDictionaryを取得することができ、そのインタフェースの実装を作ることになるでしょうそのインターフェイスのコンストラクタにそれを取るためにあなたのサービスクラスを変更:

public class MyService : IMyService 
{ 
    private ModelStateDictionary _Model; 

    public MyService(IModelStateProvider modelStateProvider) 
    { 
     _Model = modelStateProvider.GetModelState(); 
    } 
} 
+0

私たちは昨日問題を話しました。 ModelStateを渡すことは単なる例示であるが、クラスを呼び出すことから何でもよい。 DIがなければ、パターンはまっすぐ進むようです。私はそれがあなたが支払う費用だと思います。 –

関連する問題