現在、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);
}
は、誰もがこの前に実行していますか?どうやってそれを乗り越えましたか?
ありがとうございます!
私は疎結合のルールを破っていませんか?何らかの理由で具体的なメソッドの名前を変更する必要がある場合、または変更する必要がある場合、RecordはRecordDifferentになります。 IRecordを実装するRecordDifferentを持つことができ、IRecordのすべてのケースでRecordDifferentを注入するようDIを変更します。 –
私は、インターフェイスではなくモデルコンテナと継承のクラスの使用を推奨します。デフォルトでは、アクションに渡されるオブジェクトの作成にDIは使用されません。私はDIをデータコンテナ用ではなく実際のロジック用に使用します – Novakov
最初は何を意味しているのか分かりませんでしたが、このプロジェクトでは少し進歩しましたが、私は単純なデータコンテナを "デカップリング"しようとしています。データベーステーブルをマッピングするPOCOオブジェクトには(まだ)動作がありません。したがって、これらのインタフェースを使用する理由もなく、ファクトリを使用してそれらをインスタンス化することもできません。私が問題を理解していたのはデカップリングは実際にはデータのプロパティではなく動作のオブジェクトに使用されるべきだということです。 –