抽象大量类似的ASP.NET MVC操作(C#)
我正在开发的一个新的MVC5应用程序引用了一个大型ish集合(4个程序集,每个大约500个类),这些数据模型是从4GL环境生成的。基本交互让MVC应用程序出现并填充模型实例,然后(在模型验证之后)将模型实例交给提供者处理 我使用的最初方法是,对于每个模型,创建抽象大量类似的ASP.NET MVC操作(C#),c#,asp.net-mvc,design-patterns,C#,Asp.net Mvc,Design Patterns,我正在开发的一个新的MVC5应用程序引用了一个大型ish集合(4个程序集,每个大约500个类),这些数据模型是从4GL环境生成的。基本交互让MVC应用程序出现并填充模型实例,然后(在模型验证之后)将模型实例交给提供者处理 我使用的最初方法是,对于每个模型,创建 绑定到模型的脚手架剃须刀视图 具有一对操作(GET/POST)模型的部分控制器类 所有操作都是同一控制器类的一部分,该类有两个私有方法来实现每个部分中公开的GET&POST操作 因此,结构如下所示: | |--\Controllers
- 绑定到模型的脚手架剃须刀视图
- 具有一对操作(GET/POST)模型的部分控制器类
|
|--\Controllers
|
|--MyController.cs
|--MyController.MDL001.cs
|--MyController.MDL002.cs
|-- ...
|--MyController.MDL500.cs
|--\Views
|
|--\My
|--\MDL001.cshtml
|--\MDL002.cshtml
|-- ...
|--\MDL500.cshtml
每个部分控制器的实现遵循以下模式:
public partial class MyController
{
public ActionResult ProcessMDL001(MDL001Model modelInstance)
{
return ProcessModel(modelInstance);
}
public ActionResult MDL001()
{
return ShowModel("MDL001");
}
}
其中方法ProcessModel(…)
和ShowModel(…)
在MyController.cs
我想保持MVC的模型绑定和验证功能,但也希望避免几千个几乎相同的具体操作实现。是否有一些使用路由、泛型、动态等的模式/方法可以在这里提供帮助 假设可以大致相同地对待每个类,则可以使用泛型来处理此问题:
public class BaseController<T> : Controller
where T : class, new
{
public ActionResult Process(T modelInstance)
{
return ProcessModel(modelInstance);
}
...
}
公共类BaseController:控制器
T:课堂,新的
{
公共操作结果流程(T modelInstance)
{
返回ProcessModel(modelInstance);
}
...
}
但是,您需要使用子类而不是分部类。本质上,您只需实现一次操作,然后将此基本控制器子类化,以指定您正在使用的控制器实例的类型:
public MDL001ModelController : BaseController<MDL001Model>
{
}
公共MDL001ModelController:BaseController
{
}
若不需要额外的特定于类型的操作,那个么子类只需要这些代码。但是,您始终可以添加仅适用于此特定控制器实例的其他操作
若您需要稍微定制一些常见的操作,比如验证逻辑之类的,那个么您可以在您的操作中提供钩子。大致如下:
public class BaseController<T> : Controller
where T : class, new
{
public ActionResult ActionWithHook(T model)
{
DoSomeWork(model);
return View();
}
// By default this does nothing, but can be overridden to do something
internal virtual void DoSomeWork(T model)
{
}
}
公共类BaseController:控制器
T:课堂,新的
{
公共行动结果行动WithHook(T模型)
{
DoSomeWork(模型);
返回视图();
}
//默认情况下,这不做任何事情,但可以重写以执行某些操作
内部虚虚空DoSomeWork(T型)
{
}
}
然后:
公共MDL001ModelController:BaseController
{
内部覆盖无效DoSomeWork(MDL001型号)
{
//做点什么
}
}
什么是
MDL001Model
?它与MDL002Model
有何不同?MDL001…MDL500Model
类只是poco,每个类都有一组不同的属性。例如,MDL001{Id,Name}
,MDL002{Title,CreatedBy,Author}
这些东西有500个排列?您如何管理所有控制器方法。。。代码生成?POCO之间有什么共同点吗?是的,从另一个遗留系统生成。事实上,当它全部摇出时,接近2k模型。它们都共享一些公共属性(例如.Version
,.ModelName
)。如果有帮助的话,可以修改生成器,使它们都实现类似IGeneratedModel的功能。模型之间的行为是否会发生变化,或者这主要是一种CRUD场景?
public MDL001ModelController : BaseController<MDL001Model>
{
internal override void DoSomeWork(MDL001Model model)
{
// Do something
}
}