【问题标题】:LINQ to SQL, GeneralizationLINQ to SQL,泛化
【发布时间】:2009-01-07 22:20:07
【问题描述】:

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

我正在开发一个 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 语句?它看起来很丑,我敢肯定有一种我想不出的更好的方法。可能是我从错误的角度接近它。

欢迎提出任何建议。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    典型的模式是每个表一个控制器。使用公共基类将可变性重新划分为多个控制器类怎么样?像这样的:

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

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

    【讨论】:

      【解决方案2】:

      您可以尝试使用反射进行动态方法分派(从性能角度来看,它的成本相当高):

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

      【讨论】:

      • 不过,这是其中一种情况,性能影响还不错——您正在执行 1 个反射调用和一堆网络 IO(处理请求)。网络 IO 是你的慢部分,而不是反射。也许如果您为每个请求进行 100 次反射调用,您会很在意。
      • 接受它作为最终反射似乎更适合这种情况。我将进行基准测试,看看它与 if/else 或 case/switch 相比有多昂贵。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多