我是OOP和C#的新手,我正在努力理解,如何尽可能地将我的代码编写为DRY。在我的ASP.NET MVC 3应用程序中,我在控制器中有多个操作(在此示例代码中有两个),它们都返回不同的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;
}
答案 0 :(得分:3)
怎么样:
ActionTwoViewModel model = new ActionTwoViewModel();
model = createViewModel(model);
private BaseViewModel createViewModel(BaseViewModel model)
{
//
// doing a lot of stuff here
//
return model;
}
答案 1 :(得分: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);
}
答案 2 :(得分:1)
使用base(在MSDN上),您可以调用超类构造函数,然后为您的类添加您的东西。
public class ActionOneViewModel : BaseViewModel
{
public ActionOneViewModel (bool fooBar) : base()
{
//other stuff here
model.FooBar = fooBar;
}
}
答案 3 :(得分: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>();