2009-01-07 50 views
1

我正在努力找出這一點。LINQ to SQL,泛化

我正在研究一個ASP.NET MVC項目,使用LINQ to SQL來處理我的數據層。該數據庫由10個左右不同的「例外」表組成,例如「Exceptions.LADM」,「Exceptions.USB」,「Exceptions.GPO」。基本上這些表格正在追蹤用戶+機器信息以放鬆各種安全程序。

我的LINQ to SQL模型已經生成。我爲每個表提供了不同的課程。但是,我不確定如何在控制器中使用它們,而無需爲每種異常類型生成單獨的控制器操作。對於List行動,我希望做這樣的事情:

// Example Request: /Exceptions/List/ladm 
// Routing: Controller = "Exceptions", Action = "List", type = "ladm" 

// Controller Action: 

public ActionResult List(string type) 
{ 
    string viewname = "List-" + type; // refer to "List-ladm" view. 
    if(type == "ladm") 
    { 
     var items = _repository.ListAllLADMExceptions(); 
    } 

    return View(viewname, items); 
} 

我的倉庫實現ListAll<XXXXXX>Exceptions方法爲每個表。有沒有辦法避免10個不同的if/else語句?它看起來很醜,我確信有一種我想不到的更好的方式。可能是我從錯誤的角度接近它。

任何建議都會受到歡迎。

謝謝。

回答

1

您可以通過使用反射嘗試動態方法調度(這是很昂貴的,性能明智):

​​

我不過寫10例switch聲明(不if/else)。它沒有那麼壞。

switch (type) { 
    case "ladm": return View("ladm", _repository.ListAllLADMExceptions()); 
    case "....": return View(....); 
} 
+0

雖然這是其中一種情況,但性能並沒有那麼糟糕 - 您正在進行1次反射調用和一堆網絡IO(處理請求)。網絡IO是你慢的部分,而不是反射。 也許如果您對每個請求進行了100次反射調用,那麼您會很在意。 – 2009-01-07 22:37:05

2

典型的模式是每個表一個控制器。如何使用通用基類將變異性重新分成多個控制器類?這樣的事情:

public abstract class ExceptionsBaseController<T> : Controller where T:class 
{ 
    protected abstract Table<T> ExceptionsTable { get; } 

    public virtual ActionResult List() 
    { 
     var items = ExceptionsTable; 
     return View(items); 
    } 
} 

我看到它的一個好處是更容易處理異常類之間的差異,並添加新的。雖然它可能不會幫助你的總代碼行,但也許它可以喚醒想法。