2

私はOOPとC#に本当に慣れていないので、コードをできるだけDRYとして書く方法を理解しようとしています。私の ASP.NET MVC 3 アプリケーションでは、コントローラーに複数のアクション (このサンプル コードでは 2 つ) があり、ViewModelそれらはすべて同じ を継承する異なる を返しBaseViewModelます。これは、すべてのアクションで同じデータが必要ですが、それぞれに追加のプロパティが必要だからです。

ActionOneViewModelオブジェクトを受け取るコンストラクターを簡単に作成できることはわかっていViewModelます。しかし、これはこれを行う一般的な方法ですか?または、代替手段はありますか?

モデルを見る:

class BaseViewModel 
{
    public string Name { get; set; }
    public List<User> Users { get; set; }
}

class ActionOneViewModel : BaseViewModel 
{
    public bool FooBar { get; set; }
}

class ActionTwoViewModel : BaseViewModel 
{
    public string PingPong { get; set; }
}

コントローラーのアクション:

public ActionResult ActionOne () 
{
    // this doesn't work (of course)
    ActionOneViewModel model = (ActionOneViewModel)createViewModel();
    model.FooBar = true;

    return View(model);
}

public ActionResult ActionTwo () 
{
    // this doesn't work (of course)
    ActionTwoViewModel model = (ActionTwoViewModel)createViewModel();
    model.PingPong = "blub";

    return View(model);
}

private BaseViewModel createViewModel()
{
    BaseViewModel model = new BaseViewModel();

    //
    // doing a lot of stuff here
    //

    return model;
}
4

4 に答える 4

3

メソッドまたはコンストラクターで実行できます

これを使用すると、特別な「createViewModel」メソッドを用意する必要はありません。

class BaseViewModel 
{
    public BaseViewModel() {
     //stuff here
     }
    public string Name { get; set; }
    public List<User> Users { get; set; }
}

class ActionOneViewModel : BaseViewModel 
{
    public ActionOneViewModel (bool fooBar) : base() {
         FooBar = fooBar;
    }
    public bool FooBar { get; set; }
}

class ActionTwoViewModel : BaseViewModel 
{
    public ActionTwoViewModel(string pingPong) :base() {
      PingPong = pingPong;
    }
    public string PingPong { get; set; }
}

利用方法

public ActionResult ActionTwo () 
{
    // this doesn't work (of course)
    var model = new ActionTwoViewModel("blub");

    return View(model);
}
于 2012-06-19T13:55:17.747 に答える
3

どうですか:

ActionTwoViewModel model = new ActionTwoViewModel();
model = createViewModel(model);


private BaseViewModel createViewModel(BaseViewModel model)
{
    //
    // doing a lot of stuff here
    //

    return model;
}
于 2012-06-19T13:52:48.763 に答える
1

少し一般的なもので、これは機能します:

private T CreateViewModel<T>()
    where T : BaseViewModel, new()
{
    BaseViewModel model = new T();
    //doing a lot of stuff here
    return (T)model;
}

あなたはそれを次のように使うことができます:

ActionOneViewModel  model1 = CreateViewModel<ActionOneViewModel>();
ActionTwoViewModel  model2 = CreateViewModel<ActionTwoViewModel>();
于 2012-06-19T13:58:38.853 に答える
1

base (On MSDN)を使用すると、スーパークラス コンストラクターを呼び出して、クラスに独自のものを追加できます。

public class ActionOneViewModel : BaseViewModel 
{
    public ActionOneViewModel (bool fooBar) : base()
    {
        //other stuff here
        model.FooBar = fooBar;
    }
}
于 2012-06-19T13:54:28.273 に答える