誰かが私を助けてくれるかどうか疑問に思っている、少し長い概念的な質問があります。
MVC で、 kendoui のフレームワークを使用してグリッドを構築する Web サイトを構築しました。
私の Web サイトのすべてのグリッドは、使用するモデルと各モデルに実装する必要がある CRUD メソッドを除いて、まったく同じように構築されています。以下のように、各モデルが CRUD メソッドのインターフェイスを実装して、すべてのロジックを 1 か所で取得できるように設定します。
//Actual interface has variables getting passed
public interface IKendoModelInterface
{
void Save();
void Read();
void Delete();
}
public class Model1: IKendoModelInterface
{
[Key]
public int IdProperty1 { get; set; }
public int SomeProperty2 { get; set; }
public string SomeProperty3 { get; set; }
public void Save(){
//Implement Save
}
public void Read(){
//Implement Read
}
public void Delete(){
//Implement Delete
}
}
次に、グリッドを機能させるために必要なすべてのスキャフォールディング アクション メソッドの記述を高速化するために、渡されるモデルのインターフェイス メソッドを呼び出すことができる抽象コントローラーを作成しました。
//Implement the AJAX methods called by the grid
public abstract class KendoGridImplController<T> : Controller where T : class, IKendoModelInterface
{
// Method called from kendo grid
public virtual ActionResult Create([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<T> createdRecords)
{
//Invoke Create Method for Model and return results
}
public virtual ActionResult Read([DataSourceRequest]DataSourceRequest request, int Id)
{
//Invoke read method for model and return results
}
//Update and Delete also implemented..
}
次に、使用されているモデルのタイプを渡す上記の抽象コントローラーを実装するモデルごとのコントローラーが必要です。
public class ResponsibilityMatrixController : KendoGridImplController<Model1>
{
//Set up the page the grid will be on
public ActionResult Index(int id)
{
return View("SharedGridView", id);
}
//Can override abstract methods if needed but usually won't need to
}
これをさらに一歩進めることができるのか、それとも道の終わりに到達したのか疑問に思っています. モデルごとにコントローラーを作成する必要がある場合、型を抽象コントローラーに渡して同じビューを呼び出すだけのコードが繰り返されるように思えます。
昨日、型を抽象コントローラーに動的に割り当てることができるかどうかを判断するためにかなりの時間を費やしました。文字列を介してモデルのタイプを送り返す何かをセットアップしましたが、必要なメソッドを呼び出すことができました。失敗したのは、コンパイル時にタイプが不明であるため、デフォルトではどのコントローラーアクションでもマッピングを実行できなくなったことです。例えば
public virtual ActionResult Create([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<T> createdRecords)
渡された T が Model 自体ではなくインターフェイスである場合、createdRecords をこのようにバインドすることはできません。また、コンパイル時に不明な型のインスタンスにフォーム データをマップする実際の方法が見つかりませんでした。
渡されるオブジェクトのタイプのインスタンス間でこのマッピングを行う簡単な方法があるかどうか、実行時に把握できるかどうか、私が見落としているこれを設定する他の方法があるかどうか、またはそれらの両方があるかどうか疑問に思っています作業が多すぎるので、このようなことを試みて、今のようにモデルごとにコントローラーを構築するべきではありませんか?