0

今日、ちょっとにおいがするコードを少し書きました。

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();
    }

乾杯、

4

1 に答える 1

0

ダリンは正しいです(いつものように)。コントローラは、さまざまなモデル、さまざまなビュー、およびさまざまなビューモデルで動作できます。コントローラを1つの特定のビューモデルとモデルに入力することは、常にその1つのビューモデルとその1つのモデルだけを使用するという事実を知らない限り、意味がありません。

ビューモデルとモデルの間には関連性があります。この関連付けは、コントローラーで処理されます。それがその目的の1つです。コントローラの一般化に多くの労力を費やさないでください。通常、コントローラにはその使用に関連する非常に特殊なコードしか含まれておらず、再利用するためのオプションはほとんどありません。より多くのオプションが必要な場合は、再利用可能な部分を抽象化するアスペクトまたはベースクラスの使用を検討してください(基本クラスの一部の人々の認証ロジック、私は同意しません..しかしそれは選択です..他の人々は独自のカスタムを追加しますIPrincipal、または他の種類の一般的な機能。ほとんどの場合、これはジェネリックを使用する必要はありません)。

于 2012-04-25T15:34:51.713 に答える