2011-02-06 6 views
2

を作成することはできません私はそれはのStructureMapとNHibernateはを使用して、すべてのかなり標準のブランドの新しいプロジェクト、のasp.net MVC 3のStructureMapとIDependencyResolverを使用して、強力な型付きビューのインターフェイスを使用して、アクション

を持っています。

私は3つのプロジェクト、コア、インフラストラクチャ、UIを持っています。

StructureMap配線がうまくいき、サンプルコントローラのインデックスアクションが完全に機能しています。

しかし、私のビューを作成するには、私は通常のPOSTメソッドを持っているコントローラ上の

@model Project.Core.Domain.ISample 

のようなものであることを@modelを設定しました:

[HttpPost] 
    public ActionResult Create(ISample sample) 
    { 
     try 
     { 
      _repo.Save(sample); 

      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

しかし、私は入れません「インターフェイスのインスタンスを作成できません」。エラー。

スタック上の最後の実行ラインである:

[MissingMethodException:インタフェースのインスタンスを作成できません] System.RuntimeTypeHandle.CreateInstance(RuntimeType型、ブールpublicOnly、ブールNOCHECK、ブール& canBeCached 、RuntimeMethodHandleInternal & CTOR、ブール& bNeedSecurityCheck)+0 System.RuntimeType.CreateInstanceSlow(ブールpublicOnly、ブールskipCheckThis、ブールfillCache)+98 System.RuntimeType.CreateInstanceDefaultCtor(ブールpublicOnly、ブールskipVisibilityChecks、ブールのSystem.Activator.CreateInstance(Type type、Boolean nonPublic)+69 System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext、ModelBindingContext bindingContext、Type modelType)+99 System.Web.Mvc .DefaultModelBinder.BindComplexModel(ControllerContext controllerContext、ModelBindingContext BindingContextを)572 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext、ModelBindingContext BindingContextを)449 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext、parameterDescriptor parameterDescriptor)+ 317

私はtha t mvcは内部的にDependencyResolverを使用します。もしそうなら、私のISampleインターフェイスの具体的なインスタンスを作成することができます...しかし、私は何かを完全に間違って理解していて、これは意味をなさないでしょう...

私はコントローラにこの単純な変更を加えた場合、すべてが正常に動作します:

public ActionResult Create(Sample sample) 

私は間違っているかもしれないが、これは私には間違っているようで、他のすべてが通信するインタフェースを使用することで、なぜ私がしなければなりませんCreateアクションで具体的なクラスを使用しますか?これは、インターフェイスが私に与えた柔軟性の一部を取り除くでしょう。

私は間違ったトラックに進んでいる場合、誰がどのように進行するかについてのアイデアはありますか?

ご協力いただきありがとうございます。

これは私が(多分名前が良いかもしれません)

public class GenericModelBinder : DefaultModelBinder 
{ 
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
    { 
     var obj = DependencyResolver.Current.GetService(modelType); 
     return base.CreateModel(controllerContext, bindingContext, obj.GetType()); 
    } 
} 

とのGlobal.asax Iで私は新しいGenericModelBinderを作成しました

ダーリンの助けを借りて欲しかったものになった方法です追加しました:

ModelBinders.Binders.DefaultBinder = new GenericModelBinder(); 

ありがとうございました!

答えて

0

これが機能するには、ISampleタイプのカスタムモデルバインダーを作成する必要があります。 ASP.NET MVCは、アクションパラメータをリクエスト値からインスタンス化するためにコントローラアクションを呼び出すときに、デフォルトのモデルバインダを使用します。

public class MyISampleModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     // Here you need to return the proper instance of the ISample interface 
     // based on the request values or some other rules you need 
    } 
} 

、その後Application_Startにこのバインダーを登録します。あなたの助けのための

ModelBinders.Binders.Add(typeof(ISample), new MyISampleModelBinder()); 
+1

おかげで、私は私の研究の間にそれのような何かにつまずいたが、何私は考えるようになったことで、なぜ私は、特別なモデルが必要になります各モデルのバインダー?そして、なぜデフォルトの実装でDependecyResolverを使用しないのですか?それは具体的なクラスを作成することができます、それはちょうどそのインスタンスの依存リゾルバを呼び出す必要があります...またはこれは完全に間違っているでしょうか?再度、感謝します! –

関連する問題