【发布时间】: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();
现在,这是我害怕的部分,因为三件事:
您认为这是实现 n 层应用程序的好方法吗?这是一种好的设计模式还是只是一种惰性解决方案?
鉴于扩展方法要求是静态类下的静态方法,我的业务层将全部静态,这是一个好方法吗?我应该将非扩展方法放在同一个静态类下吗? (例如 GetAll() 或 AddNew())
作为 Asp Net 应用程序,拥有所有这些静态内容是不是很好?
非常感谢大家!
【问题讨论】:
标签: .net entity-framework extension-methods iqueryable n-tier-architecture