2009-01-07 65 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); 
    } 
} 

我看到它的一个好处是更容易处理异常类之间的差异,并添加新的。虽然它可能不会帮助你的总代码行,但也许它可以唤醒想法。