接下来要开始实现具体业务逻辑,首先是用户登录网站之后要能进行票务信息的查询,比如输入起始站、终点站、乘车日期,系统显示对应的车票信息,包括发车时间、票价、余量等信息。
由于本项目采用CodeFirst模式,因此首先创建对应的票务信息实体类,具体代码如下:
public class TicketRecord:BaseEntity { [Display(Name = "班次")] [Column("Number", TypeName = "nvarchar"), MaxLength(32)] public string Number { get; set; } [Display(Name = "出发站")] [Column("Starting", TypeName = "nvarchar"), MaxLength(32)] public string Starting { get; set; } [Display(Name = "终点站")] [Column("Focus", TypeName = "nvarchar"), MaxLength(32)] public string Focus { get; set; } [Display(Name = "出发日期")] public Nullable<System.DateTime> DepartureDate { get; set; } [Display(Name = "出发时间")] [Column("OutOfTime", TypeName = "time")] public TimeSpan OutOfTime { get; set; } [Display(Name = "票价")] [Column("Price", TypeName = "float")] public float Price { get; set; } [Display(Name = "余量")] [Column("Remain", TypeName = "int")] public int Remain { get; set; } }
想要对数据做增删改查操作,就需要创建对应的操作类(TicketRecordRepository),为了能够将业务逻辑和具体存储逻辑保持一定程度的分离,创建ITicketRecordRepository接口,之后在web页面层就可以适用接口对票务信息做增删改查操作。
为了解决控制器类和实现类(TicketRecordRepository)之间的依赖问题,适用Ninject依赖项解析器,具体操作方法为,在mvc根目录创建了一个新的文件夹,名为Infrastructure,在该文件夹下添加一个新的类文件,名为NinjectControllerFactory,具体代码如下
using Ninject; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; using TicketManagement.Domain.Abstract; using TicketManagement.Domain.Concrete; namespace TicketManagement.UI.Infrastructure { public class NinjectControllerFactory : DefaultControllerFactory { private IKernel ninjectKernel; public NinjectControllerFactory() { ninjectKernel = new StandardKernel(); AddBindings(); } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType); } private void AddBindings() { ninjectKernel.Bind<IUserRepository>().To<UserRepository>(); ninjectKernel.Bind<IOrderProcessor>().To<OrderProcessor>(); ninjectKernel.Bind<ITicketRecordRepository>().To<TicketRecordRepository>(); } } }
简单创建一个DefaultControllerFactory的实现类是不够的,必须告诉MVC框架如何调用它,因此在全局应用程序类global.cs中添加一行代码
接着在控制器类重写构造方法
public class TicketRecordController : Controller { // GET: TicketRecord private IUserRepository passengerRepos; private ITicketRecordRepository ticketRepos; private int pageSize = 4; public TicketRecordController(IUserRepository passengerRepos, ITicketRecordRepository ticketRepos) { this.passengerRepos = passengerRepos; this.ticketRepos = ticketRepos; }
这样在实例化该控制器时,发现有构造器有一个对 ITicketRecordRepository接口的依赖项,于是ninject自动实例化对应接口的实现类,并将其传给接口,之后就可以适用接口对票务信息做操作了。
public ActionResult Index(SearchOption option=null, int page = 1) { IEnumerable<TicketRecord> tr = ticketRepos.GetAll(); if (option.Starting != null) { tr = tr.Where(x => x.Starting == option.Starting && x.Focus == option.Focus && x.DepartureDate == x.DepartureDate); } else { option.Starting = ""; option.Focus = ""; option.Reservationdate = DateTime.Now; } TicketRecordListViewModel trlv = new TicketRecordListViewModel { TicketingRecords = tr.OrderBy(x => x.DepartureDate) .Skip((page - 1) * pageSize) .Take(pageSize), PagingInfo = new PagingInfo { CurrentPage = page, ItemsPerPage = pageSize, TotalItems = tr.Count() }, SearchOption = option }; return View(trlv); }
效果如下: