1

我正在使用 VideoGames 数据库 (SQL),并且正在编写一个 ASP 项目 (VISUAL STUDIO)。该页面的编码组织不正确,并且通过重复编码调用了某些功能。我需要通过将代码组织成函数来更好地构建 C# 编码。有人可以给我一个关于如何去做的指导。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ASPLinqToSql
{
    public partial class About : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var ctx = new VideoGamesDataContext();
            var products = from p in ctx.Products
                           select new
                           {
                               p.ProductID,
                               p.ProductName,
                               p.ProductDescription,
                               p.ListPrice
                           };
            GridView1.DataSource = products;
            GridView1.DataBind(); 
        }

        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int SupplierID = int.Parse(DropDownList1.SelectedValue);
            var ctx = new VideoGamesDataContext();
            var products = from p in ctx.Products
                           where p.SupplierID == SupplierID
                           select new
                           {
                               p.ProductID,
                               p.ProductName,
                               p.ProductDescription,
                               p.ListPrice
                           };
            GridView1.DataSource = products;
            GridView1.DataBind();
        }

        protected void btnSearch_Click(object sender, EventArgs e)
        {
            if (chkLike.Checked == true)
            {
                int Supplierid = int.Parse(DropDownList1.SelectedValue);
                var ctx = new VideoGamesDataContext();
                var products = from p in ctx.Products
                               where p.SupplierID == Supplierid
                               && p.ProductName.StartsWith(txtProductName.Text.ToString())
                               select new
                               {
                                   p.ProductID,
                                   p.ProductName,
                                   p.ProductDescription,
                                   p.ListPrice
                               };
                GridView1.DataSource = products;
                GridView1.DataBind();
            }
            else
            {
                int Supplierid = int.Parse(DropDownList1.SelectedValue);
                var ctx = new VideoGamesDataContext();
                var products = from p in ctx.Products
                               where p.SupplierID == Supplierid
                               select new
                               {
                                   p.ProductID,
                                   p.ProductName,
                                   p.ProductDescription,
                                   p.ListPrice
                               };
                GridView1.DataSource = products;
                GridView1.DataBind(); 

            }
        }
4

3 回答 3

2

您应该从数据访问逻辑(即对数据库进行查询)中分离 UI 逻辑(即,将数据分配给控件并从控件中读取数据)开始。我建议你不仅要提取方法,还要提取类:

产品存储库,其中隐藏了所有数据访问逻辑:

public interface IProductsRepository
{
    IEnumerable<Product> FindAll();
    IEnumerable<Product> FindBySupplierId(int supplierId);
}

public class ProductsRepository : IProductsRepository
{
    private object _propertyName;
    private DbContext _db;

    public ProductsRepository(DbContext db)
    {
        _db = db;
    }

    public IEnumerable<Product> FindAll()
    {
        return _db.Set<Product>();
    }

    public IEnumerable<Product> FindBySupplierId(int supplierId)
    {
        return _db.Set<Product>()
                  .Where(p => p.SupplierID == supplierId);
    }
}

另外我会创建视图模型类,而不是每次都创建相同的匿名对象:

public class ProductViewModel
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public string ProductDescription { get; set; }
    public decimal ListPrice { get; set; }
}

并使用AutoMapper在 Product 和 ProductViewModel 之间进行映射。在 Global.asax 中放置映射配置

Mapper.CreateMap<Product, ProductViewModel>();

下一步 - 将产品展示移动到单独的方法中。现在您的代码将如下所示:

public partial class About : Page
{
    private IProductsRepository _productsRepository;

    public About()
    {
        Mapper.CreateMap<Product, ProductViewModel>();
        var db = new VideoGamesDataContext();
        _productsRepository = new ProductsRepository(db);
    }

    protected void Page_Load(object sender, EventArgs e)
    {            
        var products = _productsRepository.FindAll();
        ShowProducts(products);
    }

    void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int supplierID = int.Parse(DropDownList1.SelectedValue);
        var products = _productsRepository.FindBySupplierId(supplierID);
        ShowProducts(products);
    }

    protected void btnSearch_Click(object sender, EventArgs e)
    {
        int supplierID = int.Parse(DropDownList1.SelectedValue);
        var products = _productsRepository.FindBySupplierId(supplierID);

        if(chkLike.Checked)
        {
            string name = txtProductName.Text;
            products = products.Where(p => p.ProductName.StartsWith(name));
        }

        ShowProducts(products);
    }

    public void ShowProducts(IEnumerable<Product> products)
    {
        var viewModels = Mapper.Map<IEnumerable<ProductViewModel>>(products);
        GridView1.DataSource = viewModels;
        GridView1.DataBind();
    }
}

接下来的步骤 -将存储库注入页面,甚至提取Presenter,以保持 UI 非常简单。

于 2013-07-22T09:49:06.793 回答
0

看到您的代码,我想到的可以放入函数的一件事可能如下:

您可以编写一个函数来根据搜索条件获取产品列表。例如

private List<Product> GetProducts(string SupplierId, string ProductName)
{
    //here you can pass SupplierId and ProductName as null when filtering 
    // is not required.
    var products = null;

     if(SupplierID != null)
     {
      products = from p in ctx.Products
                       select new
                       {
                           p.ProductID,
                           p.ProductName,
                           p.ProductDescription,
                           p.ListPrice
                       };
      }
     else
     {
         products = from p in ctx.Products
                       where p.SupplierID == SupplierID
                       select new
                       {
                           p.ProductID,
                           p.ProductName,
                           p.ProductDescription,
                           p.ListPrice
                       };
      }
}

像这样,您可以将条件和查询组合在一个函数中,并在需要时调用它。

希望这可以帮助!

于 2013-07-22T09:52:51.680 回答
0

要排列整个代码,您需要将其分成层。为此创建一个空白解决方案,添加两个类文件项目和一个 Web 应用程序或网站。这两个类库项目应该是 DAL 和 BAL,而 UI 将是您的 WebApp 或网站项目。

  1. 达尔
  2. 巴尔
  3. 用户界面

  4. DAL:它将是您的数据访问层,由 Datacontext 和一些自定义帮助程序类组成。您可以选择相同的存储库模式。为所有表创建 CRUD 操作的存储库。看这两篇文章

  5. http://www.iainbenson.com/programming/C-Sharp/LanguageLearner/ORM.php

  6. http://www.hightech.ir/SeeSharp/linq2sql-and-repository-pattern

  7. 现在您可以拥有一个业务层,您可以在其中拥有所有业务逻辑/计算或对象。在此项目中添加您的 DAL 项目的引用以访问 DataObjects

  8. 将业务层的引用添加到 Ui 层并相应地访问代码。

您还可以为几个可以在整个解决方案中访问的常用方法创建另一个类库类型的项目。例如根据您的项目要求发送邮件、自定义解析、字符串操作等。

N-分层架构:您也可以参考http://mikesdotnetting.com以获取更多资源。我发现这两个站点对 .net 开发人员非常有用。

于 2013-07-22T09:57:00.607 回答