2010-05-14 24 views
0

當我涉及到我的控制器/視圖時,我已經陷入瞭如何處理模型中的繼承問題。在ASP.NET MVC2和NHibernate中處理模型繼承

基本型號:

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); 
    } 
} 

但現在我有點卡住了。基本上,在列表頁面上,我需要鏈接到可以查看/編輯特定子類詳細信息的頁面,我不確定最佳策略是什麼。

我以爲我可以在ProcedureController上添加一個動作,通過動態確定要使用哪個存儲庫並加載子類傳遞給視圖來喚起正確的子類。我不得不將類存儲在ProcedureType對象中。我不得不創建/實現非通用的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); 
} 

我甚至還沒有開始整理視圖如何確定要加載哪個部分來顯示子類的詳細信息。

我想知道這是否是一種好方法?這使得確定URL變得容易。它使重新使用Procedure顯示代碼變得容易。

另一種方法是針對每個子類的特定控制器。它簡化了控制器代碼,但也意味着許多過程子類的許多簡單控制器。可以用部分視圖來計算共享的過程詳細信息。如何構建URL首先到達控制器/操作?

時間沒想到它。希望有人能讓我看到光明。提前致謝。

+0

「我甚至還沒有開始整理視圖如何確定要加載哪個部分來顯示子類細節。」 我無法解析你的大部分問題,但我可以告訴你這是錯誤的觀點。您的控制器應該確定使用哪個視圖。您的視圖應該沒有足夠的邏輯來根據模型呈現不同的子視圖。 – 2010-05-14 04:20:15

+1

當然是的。控制器將確定部分。可能通過使用命名約定(即對於ProcedureB部分命名爲_ProcedureB)或類似的東西。 – 2010-05-14 16:26:23

回答

0

那麼....我做了上面的工作,但它是完全沒有必要的。

什麼是必要的是我有我的映射到位(或至少堅持我已映射的類型)。我在調試其他東西的時候意識到,如果沒有動態投射魔法,我擁有了我所需要的一切。正是如此:

public virtual ActionResult Details(int procedureID) 
{ 
    Procedure procedure = _repository.GetById(procedureID, false); 
    return View(procedure); 
} 

這工作原因是nhibernate中加入子類的魔力。詢問超類,你會得到一個適當的子類的實例作爲超類拋出(如果它的設置正確,那就是)

方式很酷,但現在我想知道性能。我分析了SQL調用,並在所有子表中使用外連接。當有很多表格(40-50)和許多記錄時,這就是瓶頸的味道。將不得不思考,也許要查詢。