Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 静态业务层和扩展方法_.net_Entity Framework_Extension Methods_Iqueryable_N Tier Architecture - Fatal编程技术网

.net 静态业务层和扩展方法

.net 静态业务层和扩展方法,.net,entity-framework,extension-methods,iqueryable,n-tier-architecture,.net,Entity Framework,Extension Methods,Iqueryable,N Tier Architecture,我刚刚发现了扩展方法,我非常喜欢它们,以至于我害怕它们的好用 我有一个三层Asp网络应用程序。我的DAL基于实体框架,我的UI是aspx页面,我的业务逻辑过去是LINQ到实体查询的常见类,如下所示: public List<Site> GetAll() { return db.Sites.Include(s=> s.City).ToList(); } CSite objsite = new CSite(); List<Site> sites = objs

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

我有一个三层Asp网络应用程序。我的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();
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();
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();
public List GetAll()
{
返回db.Sites.Include(s=>s.City.ToList();
}
您需要像这样实例化和使用:

public List<Site> GetAll()
{
     return db.Sites.Include(s=> s.City).ToList();
}
CSite objsite = new CSite();
List<Site> sites = objsite.GetAll();
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();
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();
CSite objsite=new CSite();
List sites=objsite.GetAll();
然后我发现Iqueryable,这样我就可以像这样“重用”我的查询:

public List<Site> GetAll()
{
     return db.Sites.Include(s=> s.City).ToList();
}
CSite objsite = new CSite();
List<Site> sites = objsite.GetAll();
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();
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();
public ObjectQuery GetAll()
{
返回db.Sites.Include(s=>s.City);
}
公共IQueryable筛选器(IQueryable查询、字符串筛选器字)
{
从查询中的返回
s、 名称.包含(word)
选择s);
}
List sites=objsite.Filter(objsite.GetAll(),“Filter word”).ToList();
Filter()方法只在GetAll()iqueryable上应用where子句,这非常棒,直到我发现了扩展方法,所以我可以这样处理它:

public List<Site> GetAll()
{
     return db.Sites.Include(s=> s.City).ToList();
}
CSite objsite = new CSite();
List<Site> sites = objsite.GetAll();
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();
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();
公共静态IQueryable筛选器(此IQueryable查询,字符串字)
{
从查询中的返回
s、 名称.包含(word)
选择s);
}
这甚至更好,因为现在我有了intellisense来处理这样的查询:

public List<Site> GetAll()
{
     return db.Sites.Include(s=> s.City).ToList();
}
CSite objsite = new CSite();
List<Site> sites = objsite.GetAll();
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();
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();
List sites=objsite.GetAll().Filter(“过滤词”).ToList();
现在,这是我害怕的部分,是因为三件事:

  • 你认为这是一个n层应用的好方法吗?这是一个好的设计模式还是一个懒惰的解决方案

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

  • 作为一个Asp网络应用程序,拥有所有这些静态的东西是好的吗


  • 谢谢大家

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

    var order = 1.GetOrder(); // Extension on integer - this is really bad example
    
    示例中的问题是静态业务层。业务层必须以某种方式接收上下文,并且每个请求都必须处理上下文。在这些请求中,或者对整个应用程序使用单一上下文是出现严重问题的最佳方式。所以,除非您将上下文传递给每个方法,否则您还必须为每个请求创建业务类

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

    还要注意的是,这些都在分层体系结构中工作,但是如果您的n层意味着真正的物理分离(每一层在一个单独的服务器上),那么情况就不同了,因为您需要一些东西,允许您在一层上创建linq查询,并在另一层上执行它(在另一台服务器上,因此查询和结果必须通过网络传输)-其中一个工具是WCF数据服务