c# - 优化 MVC Controller 中的 C# 代码

标签 c# .net asp.net-mvc asp.net-mvc-2

我正在制作许多不同的 Controller ,一个与数据库中的每个存储过程相关。这些仅用于读取数据并使它们以 JSON 格式提供给 javascripts。

到目前为止,我的代码看起来是这样的,我想知道我是否错过了任何重用代码的机会,或许可以创建一些帮助类。我在 OOP 方面的经验太少,因此非常感谢这里的任何帮助和建议。

这是我到目前为止的通用代码(经过测试和工作);

using System;
using System.Configuration;
using System.Web.Mvc;
using System.Data;
using System.Text;
using System.Data.SqlClient;
using Prototype.Models;

namespace Prototype.Controllers
{
    public class NameOfStoredProcedureController : Controller
    {

        char[] lastComma = { ',' };

        String oldChar = "\"";
        String newChar = """;

        StringBuilder json = new StringBuilder();

        private String strCon = ConfigurationManager.ConnectionStrings["SomeConnectionString"].ConnectionString;
        private SqlConnection con;

        public StoredProcedureController()
        {
            con = new SqlConnection(strCon);
        }

        public string do_NameOfStoredProcedure(int parameter)
        {
            con.Open();

            using (SqlCommand cmd = new SqlCommand("NameOfStoredProcedure", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@parameter", parameter);


                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        json.AppendFormat("[{0},\"{1}\"],", reader["column1"], reader["column2"]);
                    }
                }
                con.Close();
            }

            if (json.Length.ToString().Equals("0"))
            {
                return "[]";
            }

            else
            {
                return "[" + json.ToString().TrimEnd(lastComma) + "]";
            }
        }


        //http://host.com/NameOfStoredProcedure?parameter=value
        public ActionResult Index(int parameter)
        {
            return new ContentResult
            {
                ContentType = "application/json",
                Content = do_NameOfStoredProcedure(parameter)
            };
        }
    }
}

最佳答案

我可能不会直接从 Controller 访问数据库,而宁愿将这种访问抽象化。不是真正的性能优化,而是设计改进。因此,首先定义一个模型来保存存储过程的结果:

public class MyModel
{
    public string Column1 { get; set; }
    public string Column2 { get; set; }
}

然后定义一个存储库接口(interface),它将包含对该模型的不同操作:

public interface IRepository
{
    IEnumerable<MyModel> GetModel(int id);
}

接下来实现存储库:

public class RepositorySql : IRepository
{
    public IEnumerable<MyModel> GetModel(int id)
    {
        using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SomeConnectionString"].ConnectionString))
        using (var cmd = conn.CreateCommand())
        {
            conn.Open();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "NameOfStoredProcedure";
            cmd.Parameters.AddWithValue("@parameter", id);
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return new MyModel
                    {
                        Column1 = reader["column1"].ToString(),
                        Column2 = reader["column2"].ToString()
                    };
                }
            }
        }
    }
}

最后你的 Controller 将使用存储库:

public class NameOfStoredProcedureController : Controller
{
    private readonly IRepository _repository;
    public NameOfStoredProcedureController(IRepository repository)
    {
        _repository = repository;
    }

    // Warning don't add this constructor. Use a DI framework instead.
    // This kind of constructors are called Poor Man DI (see http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/07/03/how-not-to-do-dependency-injection-in-nerddinner.aspx)
    // for more info on why this is bad.
    public NameOfStoredProcedureController() : this(new RepositorySql())
    { }

    public ActionResult Index(int parameter)
    {
        var model = _repository.GetModel(parameter);
        // Use directly Json, no need to do the serialization manually
        return Json(model);
    }
}

关于c# - 优化 MVC Controller 中的 C# 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2888490/

相关文章:

asp.net-mvc - 如何手动连接 MVC Controller 并让它呈现 Action ?

c# - 使用 Visual studio 2010 检测内存泄漏?

c# - iTextSharp 从现有的 PDF 模板生成 PDF

c# - 短路运算符

c# - 控制台.ReadLine ("Default Text Editable Text On Line")

javascript - 从数据库加载时网页挂起,并且大数据未显示在 asp.net mvc5 的图表上

c# - 如何在 Xunit 中测试使用 List<List<T> 作为输入参数的方法

c# - 如何在 WPF 窗口中只允许统一调整大小?

c# - 在 mailkit imap 中仅显示附件链接

jquery - Ajax从 Controller 获取对象到 View