5

現在、MVC 3プロジェクトでDIとしてNinjectを使用していますが、ビジネスオブジェクトは別のアセンブリに格納されています。私はコントローラのパラメータに問題があります。CRUD操作をポストバックすると、「インターフェイスのインスタンスを作成できません」というエラーが表示されます。私は、あなたがインターフェイスのインスタンスを作成することはできませんが、私はこれを回避できる唯一の方法は、カスタムモデルのバインダーを使用して、FormCollectionを渡すように思えます。これは本当に面倒なようです。私はできるだけ多くの型固有のコードをプロジェクトから取り除きたいと思います。したがって、どこにでもインターフェイスし、DIにNinjectはコンクリートをインターフェイスします。カスタムモデルのバインドだけでなく、DataAnnotationsも失われませんか?MVC 3インターフェイスを渡すエンティティ

私が持っているものを説明するためにいくつかのコード:

public ActionResult Create() 
{ 
    // I'm thinking of using a factory pattern for this part 
    var objectToCreate = new ConcereteType(); 
    return (objectToEdit); 
} 

[HttpPost] 
public ActionResult Create(IRecord record) 
{ 
    // check model and pass to repository 
    if (ModelState.IsValue) 
    { 
     _repository.Create(record); 
     return View(); 
    } 

    return View(record); 
} 

は、誰もがこの前に実行していますか?どうやってそれを乗り越えましたか?

ありがとうございます!

答えて

3

コントローラに渡されるデータは、単に値の保持者にすぎません。それらの中に論理があるべきではないので、切り離すべきことはありません。あなたは(IRecord)の代わりにインターフェイスの

+1

私は疎結合のルールを破っていませんか?何らかの理由で具体的なメソッドの名前を変更する必要がある場合、または変更する必要がある場合、RecordはRecordDifferentになります。 IRecordを実装するRecordDifferentを持つことができ、IRecordのすべてのケースでRecordDifferentを注入するようDIを変更します。 –

+1

私は、インターフェイスではなくモデルコンテナと継承のクラスの使用を推奨します。デフォルトでは、アクションに渡されるオブジェクトの作成にDIは使用されません。私はDIをデータコンテナ用ではなく実際のロジック用に使用します – Novakov

+0

最初は何を意味しているのか分かりませんでしたが、このプロジェクトでは少し進歩しましたが、私は単純なデータコンテナを "デカップリング"しようとしています。データベーステーブルをマッピングするPOCOオブジェクトには(まだ)動作がありません。したがって、これらのインタフェースを使用する理由もなく、ファクトリを使用してそれらをインスタンス化することもできません。私が問題を理解していたのはデカップリングは実際にはデータのプロパティではなく動作のオブジェクトに使用されるべきだということです。 –

6

を具体的な種類(例えばレコード)を使用することができますが、私はこの問題を回避することができる唯一の方法は、カスタムモデルバインダーカスタムモデルバインダー

を使用することであるように思えます行く正しい方法です。ところで、ドメインモデルやインタフェースではなく、アクション引数としてビューモデルを使用する必要があります。

カスタムモデルのバインディングだけでなく、DataAnnotationsも失われませんか?

なぜカスタムモデルのバインダーでは物事が乱雑になると思いますか?私にとっては、マッピングロジックを再利用可能なクラスに分離する素晴らしい方法です。そして、あなたはDataAnnotationsを失うことはありません。彼らは、カスタムモデルのバインダーが返す具体的なインスタンスで完全に正常に動作します。

+1

+1ここではいくつかの点を詳述しています:http://stackoverflow.com/questions/2899680/how-to-use-ninject-or-other-di-ioc-container-with-the-model-binder- in-asp-ne/2902871#2902871 –

+0

ありがとう、この種のソリューションを使用して存在する実用的な例を知っていますか? –

+0

@ PaulAldred-Bann http://msdn.microsoft.com/en-us/magazine/hh781022.aspx – fordareh

2

私は同じ簡単な間違いをしました。 Ninjectはコンストラクタにパラメータを挿入しますが、Index Controllerアクションにパラメータを追加しました。

それは次のようになります。

public class HomeController : Controller 
{ 
    private IRecord _record; 

    public HomeController(IRecord record) 
    { 
     _record = record; 
    } 

    public ActionResult Index() 
    { 
     ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application. " + 
          _record .HelloWorld(); 

     return View(); 
    } 
} 

は意味をなさない?

+2

ありがとう、私は同じ間違いをした:( –

関連する問題