我正在制作许多不同的 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/