抽象大量类似的ASP.NET MVC操作(C#)

抽象大量类似的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

我正在开发的一个新的MVC5应用程序引用了一个大型ish集合(4个程序集,每个大约500个类),这些数据模型是从4GL环境生成的。基本交互让MVC应用程序出现并填充模型实例,然后(在模型验证之后)将模型实例交给提供者处理

我使用的最初方法是,对于每个模型,创建

  • 绑定到模型的脚手架剃须刀视图
  • 具有一对操作(GET/POST)模型的部分控制器类
所有操作都是同一控制器类的一部分,该类有两个私有方法来实现每个部分中公开的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
    } 
}