我想通过在访问数据库时添加另一个层来改进我的.NET项目。这是我的代码:
namespace Company.Models
{
public static class AgencyBean
{
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static String createGUID(string name)
{
DataAccess dataAccess = new DataAccess();
bool exists = dataAccess.checkIfExists(Id);
if(exist)
{
dataAccess.delete(Id);
}
retur "ok";
}
}
}
我将DataAccess类放在一个名为“Helpers”的单独文件夹中,它包含了我的大多数查询:
public class DataAccess
{
public bool checkIfExists(String Id)
{
try
{
SqlConnection cnn = new SqlConnection(dataConnection);
cnn.Open();
SqlCommand check_Id = new SqlCommand("SELECT COUNT(*) FROM TABLE_GUID WHERE ([USER_ID] = @Id)", cnn);
check_Id.Parameters.AddWithValue("@Id", Id);
int UserExist = (int)check_Id.ExecuteScalar();
if (UserExist > 0)
{
return true;
}
else
{
return false;
}
}
catch (SqlException ex)
{
Debug.WriteLine("SQL Exception " + ex);
DisplaySqlErrors(ex);
throw ex;
}
}
}
public class AgentBeanController : Controller
{
// GET: AgentBean
public ActionResult Index(string name)
{
return View();
}
[AllowAnonymous]
[WebMethod]
public string AgentURL() //here we create Agent URL and return it to the view
{
string var = Models.AgentBean.createGUID("TODO");
return var;
}
}
我以非常直接的方式访问数据库。如何使用更好的技术,这样访问可以更安全,如通过服务层访问? 我正在连接某个服务器中的现有sql数据库,并在我的项目中使用MVC架构。
答案 0 :(得分:1)
所以这就是我过去所做的。
首先,这是你的“模型”命名空间......模型永远不应该有数据库连接。相反,你有一个独立的类,如控制器,可以保湿一些模型。
其次,我有一个“服务”类,它连接到“存储库”类。存储库类实现了一个接口来识别您正在使用的数据库的确切“类型”......但如果这不是您需求的一部分,那么您可能不需要那么远。
第三,查找依赖注入(aka,DI)。那里有几个框架。就我个人而言,我已经使用过Autofac,但其他人也存在,以便更轻松地完成工作。
第四,在你的“控制器”,“服务”和“存储库”类上,实现依赖注入,以及形成合同所需的任何接口。
第五,我会使用一个实际的控制器命名空间而不是你的模型名称空间来推动http调用带来....而是在你的控制器类中创建一个动作,并实例化你的“ “agencyBean”,用数据对其进行水合,然后将该模型返回到您的视图中。
基本上,在这样的场景中,你试图让每个组件按照指定的方式行事......将责任分解成更小的部分并专注于此。您的控制器应该只是“获取”您的模型,并根据需要或任何其他业务类型逻辑对其进行一些转换 您的服务应该处理控制器和数据库层之间的通信 您的数据访问层(即,在这种情况下,某些“存储库”类...)将执行所有这些新数据连接和/或设置对存储过程或查询的调用。
以这种方式做事有很多好处。一些重要的是可维护性,可读性和代码重用。当然,无论在哪里,文件都会使你的项目变得更复杂......但这可能是一件好事。它比把所有东西都砸到一个单独的类中并让它做所有事情要好得多:)
但是,仅供参考,这是我过去所做的一项实施......我确信有更好的方法,但这种设置对我和我的团队来说非常有效。
以下是使用您发布的部分代码的小例子。我没有检查这是否有拼写错误,它不会编译,但应该有助于大致了解我在说什么....
namespace Company.Models
{
public class AgencyBean
{
public AgencyName{get;set;}
public AgencyId{get;set;}
// other properties...
}
}
namespace Company.Controllers
{
public class MyController : Controller
{
private readonly IMyService myService;
public MyController(IMyService myService) // <-- this is your dependency injection here...
{
this.myService = myService;
}
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static String createGUID(string name)
{
var model = new AgencyBean();
model.AgencyId = 1;
model = myService.getAgency(agencyBean);
return model;
}
}
}
namespace Company.Services
{
public class MyService
{
private readonly IMyRepository myRepository;
public MyService(IMyRepository myRepository) // <-- this is your dependency injection here...
{
this.myRepository = myRepository;
}
public AgencyBean getAgency(AgencyBean model){
var dataTable = myRepository.getAgencyData(model.AgencyId);
// fill other properties of your model you have...
// ...
// ...
return model;
}
}
}
namespace Company.Repositories
{
public class MyRepository : IDatabaseCommon // <-- some interface you would use to ensure that all repo type objects get connection strings or run other necessary database-like setup methods...
{
private readonly String connectionString{get;set;}
public MyRepository()
{
this.connectionString = //get your connection string from web.config or somewhere else...;
}
public DataTable getAgencyData(int id){
var dataTable = new DataTable();
// perform data access and fill up a data table
return dataTable;
}
}
}