【问题标题】:Static business tier and extension methods静态业务层和扩展方法
【发布时间】:2011-08-02 13:39:56
【问题描述】:

我刚刚发现了扩展方法,我非常喜欢它们,以至于我害怕它们的好用......

我有一个 3 层的 Asp Net 应用程序。我的 DAL 基于实体框架,我的 UI 是 aspx 页面,我的业务逻辑曾经是使用 LINQ 到实体查询的通用类,如下所示:

public List<Site> GetAll()
{
     return db.Sites.Include(s=> s.City).ToList();
}

你需要像这样实例化和使用:

CSite objsite = new CSite();
List<Site> sites = objsite.GetAll();

然后我发现了 Iqueryable,因此我可以像这样“重用”我的查询:

public ObjectQuery<Site> GetAll()
{
     return db.Sites.Include(s=> s.City);
}

public IQueryable<Site> Filter(IQueryable<Site> query, string filterWord)
{
     return (from s in query
             s.Name.Contains(word)
             select s);
}

List<Site> sites = objsite.Filter(objsite.GetAll(),"filter word").ToList();

Filter() 方法只是在 GetAll() iqueryable 上应用 where 子句,这很棒,直到我发现扩展方法,所以我可以像这样处理它:

public static IQueryable<Site> Filter(this IQueryable<Site> query, string word)
{
      return (from s in query
             s.Name.Contains(word)
             select s);
}

这更好,因为现在我的查询具有智能感知功能,如下所示:

List<Site> sites = objsite.GetAll().Filter("filter word").ToList();

现在,这是我害怕的部分,因为三件事:

  1. 您认为这是实现 n 层应用程序的好方法吗?这是一种好的设计模式还是只是一种惰性解决方案?

  2. 鉴于扩展方法要求是静态类下的静态方法,我的业务层将全部静态,这是一个好方法吗?我应该将非扩展方法放在同一个静态类下吗? (例如 GetAll() 或 AddNew())

  3. 作为 Asp Net 应用程序,拥有所有这些静态内容是不是很好?

非常感谢大家!

【问题讨论】:

    标签: .net entity-framework extension-methods iqueryable n-tier-architecture


    【解决方案1】:

    IQueryable 之上使用自定义扩展方法是很常见的。我认为这是重用查询部分的好方法。应谨慎使用扩展方法。扩展方法只是静态方法的语法糖。我的朋友有一个关于他的同事的好故事,他最近发现了扩展方法并开始使用如下代码:

    var order = 1.GetOrder(); // Extension on integer - this is really bad example
    

    您的示例中的问题是静态业务层。业务层必须以某种方式接收上下文,并且必须根据请求处理上下文。 Sharing context 在请求中或对整个应用程序具有单一上下文是遇到严重问题的最佳方式。因此,除非您将上下文传递给每个方法,否则您还必须为每个请求创建业务类。

    但您仍然应该在 IQueryalbe 上使用扩展名。您可能会发现您的业务类只是 context.Query 的包装,在这种情况下,它是不需要的附加层。

    另外请注意,这一切都适用于分层架构,但如果您的 n 层意味着真正的物理分离(每一层在单独的服务器上),那么情况就不同了,因为您需要一些可以让您创建 linq 查询的东西在一层上并在另一层上执行它(在另一台服务器上,因此查询和结果必须通过网络传输) - 一个这样的工具是 WCF 数据服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-05
      • 2014-09-13
      • 2010-10-26
      • 2011-05-12
      • 2011-05-29
      • 2023-03-10
      • 2015-03-28
      相关资源
      最近更新 更多