ASP.NET MVC 3 & Unity.MVC3
最近学习了下 ASP.NET MVC,比较之前的 WebForm 没有了 IsPostBack 的判断,事件处理也被 Action 取代。MVC 中 WebForm中大量的事件处理中UI绑定,混杂的 js 注入, style 修改没有了;服务端控件不用了,结局是 View 被释放了,Controller可以被单元测试了,拿着 ViewModel 可以快速替换 View。(说句实话要不是有 Razor 这样的页面引擎加上 VS IDE 的强力智能感知,ASP.NET MVC 和 JSP 没有区别,说不定还会有人把 strust 标签,spring 标签拿来在 .NET 上封装一遍)
再加上现在的 EF,Model层以及DAL实现很自然的交给了 EF等ORM框架。加上现在的成熟的 Repository Pattern 和 UnitOfWork Pattern 实践上的Service分层也变成约定俗成。(关于 Repository 和 UnitOfWork 参看:Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application) 。分离出 Repository, UnitOfWork 就是避免在 Controller 里直接写入 Linq2Db 的代码,这样难以实现 Mockup,好比下面的代码:
(详细参考:Walkthrough: Using TDD with ASP.NET MVC)
【没有使用 Repository Pattern 的代码】
[csharp]
public class HomeController : Controller {
ContactEntities _db = new ContactEntities();
public ActionResult Index() {
var dn = _db.Contacts;
return View(dn);
}
}
【使用 Repository Pattern 的代码】
[csharp]
namespace MvcContacts.Models {
public class EF_ContactRepository : MvcContacts.Models.IContactRepository {
private ContactEntities _db = new ContactEntities();
public Contact GetContactByID(int id) {
return _db.Contacts.FirstOrDefault(d => d.Id == id);
}
...
测试可以用个 Mock Repository,_db 数据从哪来就自由了...
[csharp]
namespace MvcContacts.Tests.Models {
class InMemoryContactRepository : MvcContacts.Models.IContactRepository {
private List<Contact> _db = new List<Contact>();
...
而 Controller 变成这样: www.2cto.com
[csharp]
public class HomeController : Controller {
IContactRepository _repository;
public HomeController() : this(new EF_ContactRepository()) { }
public HomeController(IContactRepository repository) {
_repository = repository;
}
public ViewResult Index() {
throw new NotImplementedException();
相关新闻>>
- 发表评论
-
- 最新评论 更多>>