Pro Aspnet MVC 4读书笔记(2) - The MVC Pattern
Listing 3-1. The C# Auction Domain Model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcPattern.Models
{
public class Member
{
public string LoginName { get; set; } // The unique key
public int ReputationPoints { get; set; }
} public class Bid
{
public Member Member { get; set; }
public DateTime DatePlaced { get; set; }
public decimal BidAmount { get; set; }
} public class Item
{
public int ItemID { get; private set; } // The unique key
public string Title { get; set; }
public string Description { get; set; }
public DateTime AuctionEndDate { get; set; }
public IList<Bid> Bids { get; set; }
}
}
Listing 3-2. C# Repository Classes for the Member and Item Domain Classes
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcPattern.Models
{
public class MembersRepository
{
public void AddMember(Member member)
{ } public Member FetchByLoginName(string loginName)
{
return null;
} public void SubmitChanges()
{ }
} public class ItemsRepository
{
public void AddItem(Item item)
{ } public Item FetchById(int itemId)
{
return null;
} public IList<Item> ListItems(int pageSize, int pageIndex)
{
return null;
} public void SubmitChanges()
{ }
}
}
Listing 3-3. Instantiating Concrete Classes to Get an Interface Implementation
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcPattern.Models
{
public class PasswordResetHelper
{
public void ResetPassword()
{
IEmailSender mySender = new MyEmailSender(); // Call interface methods to configure e-mail details mySender.SendEmail();
}
}
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcPattern.Models
{
public interface IEmailSender
{
void SendEmail();
} public class MyEmailSender : IEmailSender
{
public void SendEmail()
{
}
}
}
Listing 3-4. Removing Dependencies from the PasswordResetHelper Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcPattern.Models
{
public class PasswordResetHelper
{
private IEmailSender _emailSender; public PasswordResetHelper(IEmailSender emailSender)
{
_emailSender = emailSender;
} public void ResetPassword()
{
// Call interface methods to configure e-mail details
_emailSender.SendEmail();
}
}
}
Listing 3-5. The IMembersRepository Interface
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcPattern.Models
{
public interface IMembersRepository
{
void AddMember(Member member);
Member FetchByLoginName(string loginName);
void SubmitChanges();
} public class MembersRepository : IMembersRepository
{
public void AddMember(Member member)
{ } public Member FetchByLoginName(string loginName)
{
return null;
} public void SubmitChanges()
{ }
}
}
Listing 3-6. The AdminController Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcPattern.Models; namespace MvcPattern.Controllers
{
public class AdminController : Controller
{
IMembersRepository _membersRepository; public AdminController(IMembersRepository membersRepository)
{
_membersRepository = membersRepository;
} public ActionResult ChangeLoginName(string oldLoginName, string newLoginName)
{
Member member = _membersRepository.FetchByLoginName(oldLoginName);
member.LoginName = newLoginName; _membersRepository.SubmitChanges(); return View();
}
}
}
Listing 3-7. An Example Test Fixture
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MvcPattern.Controllers;
using MvcPattern.Models; namespace MvcPattern.Tests
{
[TestClass]
public class AdminControllerTest
{
[TestMethod]
public void CanChangeLoginName()
{
// Arrange (set up a scenario)
Member bob = new Member() { LoginName = "Bob" };
FakeMembersRepository repository = new FakeMembersRepository();
repository.Members.Add(bob); AdminController target = new AdminController(repository); string oldLoginName = bob.LoginName;
string newLoginName = "Anastasia"; // Act (attempt the operation)
target.ChangeLoginName(oldLoginName, newLoginName); // Assert (verify the result)
Assert.AreEqual(newLoginName, bob.LoginName);
Assert.IsTrue(repository.DidSubmitChanges); }
} private class FakeMembersRepository : IMembersRepository
{
public List<Member> Members = new List<Member>();
public bool DidSubmitChanges = false; public void AddMember(Member member)
{
} public Member FetchByLoginName(string loginName)
{
return Members.First(m => m.LoginName == loginName);
} public void SubmitChanges()
{
DidSubmitChanges = true;
}
}
}
Listing 3-8. Adding a Stub Method to the Item Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcPattern.Models
{
public class Item
{
public int ItemID { get; private set; } // The unique key
public string Title { get; set; }
public string Description { get; set; }
public DateTime AuctionEndDate { get; set; }
public IList<Bid> Bids { get; set; } public void AddBid(Member member, Decimal amount)
{
throw new NotImplementedException();
}
}
}
Listing 3-9. Three Test Fixtures
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MvcPattern.Controllers;
using MvcPattern.Models; namespace MvcPattern.Tests
{
[TestClass]
public class AdminControllerTest
{
[TestMethod]
public void CanAddBid()
{
// Arrange - set up the scenario
Item target = new Item();
Member member = new Member();
Decimal amount = 150M; // Act - perform the test
target.AddBid(member, amount); // Assert - check the behavior
Assert.AreEqual(, target.Bids.Count());
Assert.AreEqual(amount, target.Bids[].BidAmount);
} [TestMethod()]
[ExpectedException(typeof(InvalidOperationException))]
public void CannotAddLowerBid()
{
// Arrange
Item target = new Item();
Member member = new Member();
Decimal amountParam = 150M; // Act
target.AddBid(member, amountParam);
target.AddBid(member, amountParam - );
} [TestMethod()]
public void CanAddHigherBid()
{
// Arrange
Item target = new Item();
Member firstMember = new Member();
Member secondMember = new Member();
Decimal amount = 150M; // Act
target.AddBid(firstMember, amount);
target.AddBid(secondMember, amount + ); // Assert
Assert.AreEqual(, target.Bids.Count());
Assert.AreEqual(amount + , target.Bids[].BidAmount);
}
}
}
Listing 3-10. Implementing the AddBid Method
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcPattern.Models
{
public class Item
{
public int ItemID { get; private set; } // The unique key
public string Title { get; set; }
public string Description { get; set; }
public DateTime AuctionEndDate { get; set; }
public IList<Bid> Bids { get; set; } public Item()
{
Bids = new List<Bid>();
} public void AddBid(Member member, Decimal amount)
{
Bids.Add(new Bid() {
BidAmount = amount,
DatePlaced = DateTime.Now,
Member = member
});
}
}
}
Listing 3-11. Improving the Implementation of the AddBid Method
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MvcPattern.Models
{
public class Item
{
public int ItemID { get; private set; } // The unique key
public string Title { get; set; }
public string Description { get; set; }
public DateTime AuctionEndDate { get; set; }
public IList<Bid> Bids { get; set; } public Item()
{
Bids = new List<Bid>();
} public void AddBid(Member member, Decimal amount)
{
if (Bids.Count == || amount > Bids.Max(e => e.BidAmount))
{
Bids.Add(new Bid()
{
BidAmount = amount,
DatePlaced = DateTime.Now,
Member = member
});
}
else
{
throw new InvalidOperationException("Bid amount too low");
}
}
}
}
Pro Aspnet MVC 4读书笔记(2) - The MVC Pattern的更多相关文章
- 【Tools】Pro Git 一二章读书笔记
记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧. Pro Git (Scott Chacon) 读书笔记: ...
- [Git00] Pro Git 一二章读书笔记
记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧. Pro Git (Scott Chacon) 读书笔记: ...
- Pro Aspnet MVC 4读书笔记(1) - Your First MVC Application
Listing 2-1. The default contents of the HomeController class using System; using System.Collections ...
- Pro Aspnet MVC 4读书笔记(4) - Working with Razor
Listing 5-1. Creating a Simple Domain Model Class using System; using System.Collections.Generic; us ...
- Pro Aspnet MVC 4读书笔记(3) - Essential Language Features
Listing 4-1. The Initial Content of the Home Controller using System; using System.Collections.Gener ...
- Pro Aspnet MVC 4读书笔记(5) - Essential Tools for MVC
Listing 6-1. The Product Model Class using System; using System.Collections.Generic; using System.Li ...
- 《Pro Android Graphics》读书笔记之第四节
Android Procedural Animation: : XML, Concepts and Optimization Procedural Animation Concepts: Tweens ...
- 《Pro Android Graphics》读书笔记之第三节
Android Frame Animation: XML, Concepts and Optimization Frame Animation Concepts: Cels, Framerate, a ...
- 《Pro Android Graphics》读书笔记之第六节
Android UI Layouts: Graphics Design Using the ViewGroup Class Android ViewGroup Superclass: A Founda ...
随机推荐
- 初识google多语言通信框架gRPC系列(三)C#中使用gRPC
我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...
- 程序设计实践C++ 程序代写(QQ 928900200)
程序设计实践 采用C++作为编程语言. 设计开发一个“学生信息”管理系统.该系统模拟数据库管理系统(DBMS)的功能,为用户提供数据存储.查找的能力. 该系统存储的学生信息包括: 学号.姓名.性别.语 ...
- 重新想象 Windows 8 Store Apps (11) - 控件之 ListView 和 GridView
原文:重新想象 Windows 8 Store Apps (11) - 控件之 ListView 和 GridView [源码下载] 重新想象 Windows 8 Store Apps (11) - ...
- 如何设置一个activity透明
1.在AndroidManifest.xml文件中设置: android:theme="@android:style/Theme.Translucent 此代码固定为全背景透明. 2.在Ac ...
- 苹果Swift编程语言新手教程【中文版】
文件夹 1 简单介绍 2 Swift入门 3 简单值 4 控制流 5 函数与闭包 6 对象与类 7 枚举与结构 1 简单介绍 Swift是供iOS和OS X应用编程的新编程语言,基于C和Objecti ...
- 进程和线程之间的关系和区别 和 CPU牒
流程具有一定独立功能的程序关于某个数据集合上的一次执行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立执行的基本单位. 进 ...
- NVIDIA+关联2015写学校招收评论(嵌入式方向,上海)
我没有写很长一段时间Blog中的一个,在过去的几个月中还没有看到太多的生长技术,来来回回一直在做的事情,要毕业找工作,但发现并没有冷静下来,准备过.这不是让人觉得暂时补习班是凡人啊. 本科不试试.那你 ...
- Java设计模式菜鸟系列(两)建模与观察者模式的实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577 观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一 ...
- 探索Windows Azure 监控和自动伸缩系列2 - 获取虚拟机的监控定义和监控数据
上一篇博文介绍了如何连接Windows Azure: http://www.cnblogs.com/teld/p/5113063.html 本篇我们继续上次的示例代码,获取虚拟机的监控定义和监控数据. ...
- Chapter 1 Securing Your Server and Network(1):选择SQL Server运行账号
原文:Chapter 1 Securing Your Server and Network(1):选择SQL Server运行账号 原文出处:http://blog.csdn.net/dba_huan ...