C# 在ASP.NET MVC2中处理模型继承&;亚硝酸铵

C# 在ASP.NET MVC2中处理模型继承&;亚硝酸铵,c#,nhibernate,asp.net-mvc-2,C#,Nhibernate,Asp.net Mvc 2,当涉及到控制器/视图时,我一直在思考如何在模型中处理继承 基本型号: public class Procedure : Entity { public Procedure() { } public int Id { get; set; } public DateTime ProcedureDate { get; set; } public ProcedureType Type { get; set; } } public ProcedureA : Proced

当涉及到控制器/视图时,我一直在思考如何在模型中处理继承

基本型号:

public class Procedure : Entity
{
    public Procedure() { }

    public int Id { get; set; }
    public DateTime ProcedureDate { get; set; }
    public ProcedureType Type { get; set; }
}

public ProcedureA : Procedure
{
    public double VariableA { get; set; }
    public int VariableB { get; set; }
    public int Total { get; set; }
}

public ProcedureB : Procedure
{
    public int Score { get; set; }
}
等等。。。许多不同的程序最终都会失败

因此,我会列出所有程序:

public class ProcedureController : Controller
{
    public virtual ActionResult List()
    {
        IEnumerable<Procedure> procedures = _repository.GetAll();
        return View(procedures);
    }
}
公共类过程控制器:控制器
{
公共虚拟操作结果列表()
{
IEnumerable过程=_repository.GetAll();
返回视图(程序);
}
}
但现在我有点困了。基本上,从列表页面,我需要链接到可以查看/编辑特定子类详细信息的页面,我不确定最佳策略是什么

我想我可以在ProcedureController上添加一个操作,通过动态地确定要使用的存储库并加载要传递给视图的子类,从而生成正确的子类。我必须将该类存储在ProcedureType对象中。我必须创建/实现一个非泛型IRepository,因为我无法动态转换为泛型IRepository

public virtual ActionResult Details(int procedureID)
{
    Procedure procedure = _repository.GetById(procedureID, false);
    string className = procedure.Type.Class;
    Type type = Type.GetType(className, true);
    Type repositoryType = typeof (IRepository<>).MakeGenericType(type);
    var repository = (IRepository)DependencyRegistrar.Resolve(repositoryType);
    Entity procedure = repository.GetById(procedureID, false);
    return View(procedure);
}
公共虚拟操作结果详细信息(int procedureID)
{
Procedure=\u repository.GetById(procedureID,false);
字符串className=procedure.Type.Class;
Type=Type.GetType(className,true);
类型repositoryType=typeof(IRepository)。MakeGenericType(Type);
var repository=(IRepository)dependencyRegistrator.Resolve(repositoryType);
实体过程=repository.GetById(procedureID,false);
返回视图(程序);
}

我甚至还没有开始整理视图如何决定加载哪个部分来显示子类细节

我想知道这是不是一个好办法?这使得确定URL变得容易。这使得重用过程显示代码变得容易

另一种方法是为每个子类指定特定的控制器。它简化了控制器代码,但也意味着为许多过程子类提供了许多简单的控制器。可以通过局部视图计算出共享过程的详细信息。首先,如何构造URL以访问控制器/操作


是时候不去想了。希望有人能给我指路。提前谢谢。

嗯……我上面所做的很好,但完全没有必要

必要的是,我已经准备好了映射(或者至少坚持使用我映射的类型)。不久前,在调试其他东西时,我意识到,在没有动态施法魔法的情况下,我拥有了我所需要的一切。仅此而已:

public virtual ActionResult Details(int procedureID)
{
    Procedure procedure = _repository.GetById(procedureID, false);
    return View(procedure);
}
这是由于nhibernate中连接子类的魔力。请求超类,您将得到相应子类的一个实例,该子类被转换为超类(即,如果所有子类都设置正确的话)


很酷,但现在我想知道性能。我分析了SQL调用,它在所有子表中使用外部联接。当有很多表(40-50)和很多记录时,这就有了瓶颈的味道。将不得不仔细考虑,也许还要询问。

“我甚至还没有开始整理视图将如何决定加载哪个部分来显示子类的详细信息。”我无法解析您的大部分问题,但我可以告诉您,对于视图来说,这是错误的方法。控制器应确定要使用的视图。您的视图中不应该有足够的逻辑来根据模型呈现不同的子视图。当然,是的。控制器将确定部分故障。可能是通过使用命名约定(即ProcedureB的Partial被命名为_ProcedureB)或类似的方式。