您的控制器应该收集构建用户当前正在查看的页面所需的信息。而已。
控制器应引用业务逻辑层中的类。
例如,这里是你的控制器。它所做的只是转换http请求并调用业务逻辑。
public class MyController : Controller
{
private IMyBusinessLogic _businessLogic;
public MyController(IMyBusinessLogic businessLogic)
{
_businessLogic = businessLogic;
}
[HttpPost]
public ActionResult UpdateAllRecords()
{
_businessLogic.UpdateAllRecords();
return Json(new Success());
}
}
和你的业务逻辑类
public class MyBusinessLogic : IMyBusinessLogic
{
public void UpdateAllRecords()
{
// call SP here
using(SqlConnection conn = new...
}
}
有许多的优势,这一点:
- 你的业务逻辑是完全从你的用户界面分离,没有数据库的代码在你的表示层。这意味着您的控制器可以专注于它的工作,并且代码不会受到污染。
- 您可以测试控制器,看看当你的业务逻辑成功会发生什么,抛出异常等
对于你应该考虑创建一个数据访问层额外的奖励积分。
public void DataAccess : IDataAccess
{
public void RunStoredProcedure(string spName)
{
}
}
现在您可以测试您的BLL正在调用并正确处理您的SP结果!
扩展以下评论质疑模型: 理想情况下,您的模型应该没有任何逻辑。它应该只是表示构建页面所需的数据。您加载的对象代表系统中的实体,模型代表显示在页面上的数据。这通常要轻得多,并且可能包含额外的信息(例如他们的地址),这些信息不在主要实体上,而是显示在页面上。
例如
public class Person
{
public int PersonID {get;set;}
public string Firstname {get;set;}
public string Lastname {get;set;}
public Address Address {get;set;}
}
模型只包含要显示的信息:
public class PersonSummaryModel
{
public int PersonID {get;set;}
public string FullName {get;set;}
}
你再传给你的模型视图中显示它(也许在FullNames的列表这个案例)。很多人使用mapper类来转换这两者,有些人在控制器中进行转换。
例如
public class PersonMapper
{
public PersonSummaryModel Map(Person person)
{
return new PersonSummaryModel
{
PersonID = person.PersonID,
FullName = string.Concat(person.Firstname, " ", person.Lastname)
};
}
}
您也可以使用一些自动化的解决方案,在AutoMapper这样做这一步你。
正如所有的东西,这个取决于你要多少精力投入在有很大的文章。适当的层和分离关注/单元测试对于单页小应用程序来说可能是过度的。我已经回答了这个问题,假设你想以“正确”的方式做事,即使它是一个小例子项目 – Liath 2014-08-29 09:41:29