客车网上售票系统—票务查询(五)

  接下来要开始实现具体业务逻辑,首先是用户登录网站之后要能进行票务信息的查询,比如输入起始站、终点站、乘车日期,系统显示对应的车票信息,包括发车时间、票价、余量等信息。

  由于本项目采用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;
        }
View Code

   这样在实例化该控制器时,发现有构造器有一个对 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);
        }
View Code

  效果如下:

  

  

猜你喜欢

转载自www.cnblogs.com/microplace/p/13388761.html