LINQ to SQL,泛化

时间:2009-01-07 22:20:08

标签: c# asp.net-mvc linq-to-sql

我正在努力解决这个问题。

我正在开发一个ASP.NET MVC项目,使用LINQ to SQL作为我的数据层。该数据库由10个左右的不同“例外”表组成,例如: “Exceptions.LADM”,“Exceptions.USB”,“Exceptions.GPO”。基本上这些表正在跟踪用户+机器信息,以便放松各种安全程序。

我的LINQ to SQL模型已生成。我可以为每个表提供不同的类。但是,我不知道如何在控制器中使用它们而不必为每种异常类型生成单独的Controller Actions。对于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语句?它看起来很难看,我确信有一种更好的方式让我无法想到。可能是我从不正确的角度接近它。

欢迎任何建议。

感谢。

2 个答案:

答案 0 :(得分: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);
    }
}

我认为一个好处是更容易处理异常类之间的差异并添加新的异常类。它可能无法帮助你计算整个代码行数,但也许它可以唤醒你的想法。

答案 1 :(得分:1)

您可以尝试使用反射进行动态方法调度(它的成本相当高,性能明显):

object items = _repository.GetType().GetMethod("ListAll"+type+"Exceptions")
                          .Invoke(_repository, null);

我会为10个案例写一个switch语句(不是if/else)。这不是那么糟糕。

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