今日、ちょっとにおいがするコードを少し書きました。
public class SomeController : GenericController<SomeViewModel, SomeModel>
これは、特定のモデルとビューモデルに制約されたジェネリック コントローラーです。今、匂いがするのは、モデルとViewModelの間の関係を定義しているという事実です.ControllerがViewModelについて知っていることは気にしません。私がこれをしたいのは、コントローラーがビューモデルに何らかの方法で尋ねるようにすることです。これは、カップリングが私のビューにあるはずだからです。私が考えることができる唯一の方法は、コントローラーファクトリーです。これにより、提供されたViewModelを検査し、実行時に定義されたModelを使用してControllerのインスタンスを作成およびインスタンス化できます。
したがって、上記は単に
public class SomeController : GenericController<SomeViewModel, TModel> where TModel : Model
実行時にのみ入力できます。これを行う方法についてのアイデアはありますか?反射?ジェネリック?属性?それともこれは本当に悪い考えですか?
============編集===========
ジェネリックを使用する理由は、コントローラー全体で多くの共有コードがあり、コントローラーがインターンでリポジトリを使用するサービスを使用するためです。サービスとリポジトリは、ドメイン オブジェクトのタイプによって異なります。public ViewResultBase Add(TViewModel viewModel)
Generic Controllerなどのメソッドは、ViewModel を Model に変換し、これをサービス -> リポジトリに渡す汎用マッパーを使用します。
============編集===========
ジェネリック引数を使用する共有コードを示す基本クラスのスニペットを次に示します。
[HttpGet]
public virtual PartialViewResult List(int id)
{
var model = BuildListDetails(id);
return PartialView(model);
}
[Dependency]
public IService<TDomainObject> Service { get; set; }
protected IEnumerable<TViewModel> BuildListDetails(int id)
{
var nodes = Service.GetData(UserState.Current.User.UserID, id);
if (nodes == null) return null;
return nodes.Select(n => ModelMapperFactory<TDomainObject, TViewModel>.Instance.Create(n)).AsEnumerable();
}
乾杯、