zoukankan      html  css  js  c++  java
  • 搭建自己的框架WedeNet(四)

    WedeNet2018.Web-UI层:
    结构如下:

    首先,在Controller中定义BaseController,以便加入统一处理逻辑,如下:

    using log4net;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using WedeNet2018.Common;
    
    namespace WedeNet2018.Web.Controllers
    {
        /// <summary>
        /// 控制器基类
        /// </summary>
        public class BaseController : Controller
        {
            protected ILog log { get; set; }
          
            protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                base.OnActionExecuting(filterContext);
                log.Info("---进入BaseController---");
            }
    
        }
    }
    

    在这里我们也声明了log4net变量,可在其派生类中决定使用哪一种配置的log。
    以默认控制器为例:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using WedeNet2018.BussinessLogic;
    using PagedList;
    using WedeNet2018.Infrastructure;
    using System.Text.RegularExpressions;
    using WedeNet2018.Common;
    using WedeNet2018.Common.Models;
    using log4net;
    
    namespace WedeNet2018.Web.Controllers
    {
        public class HomeController : BaseController
        {
            private OrdersBussinessLogic orderBll;
            private ElongOrdersDetailsBussinessLogic elongBll;
            private EmployeesBussinessLogic employeeBll;
    
            public HomeController(OrdersBussinessLogic BLL, ElongOrdersDetailsBussinessLogic ElongBll, EmployeesBussinessLogic EmployeeBll)
            {
                log = LoggerHelper.WedeNetLogger;
                orderBll = BLL;
                elongBll = ElongBll;
                employeeBll = EmployeeBll;
    
                log.Info("----HomeController初始化完成。----");
            }
    
            public ActionResult Index(int? page)
            {
                log.InfoFormat("初始化首页数据,page={0}", page);
                int pageSize = 10;
                int pageNum = (page ?? 1);
    
                var orders = orderBll.GetOrders(46).OrderBy(o => o.Id);
    
                return View(orders.ToPagedList(pageNum,pageSize));
                
            }
    
            public ActionResult Create()
            {
                return View();
            }
    
            [HttpPost]
            public ActionResult Create(Orders order)
            {
                if (string.IsNullOrEmpty(order.OrderSn))
                {
                    ModelState.AddModelError("OrderSn", "OrderSn不能为空");
                }
                if (order.UserId<0)
                {
                    ModelState.AddModelError("UserId", "UserId必须大于0");
                }
                if (string.IsNullOrEmpty(order.UserName))
                {
                    ModelState.AddModelError("UserName", "UserName不能为空");
                }
                if (string.IsNullOrEmpty(order.UserMobile))
                {
                    ModelState.AddModelError("UserMobile", "UserMobile不能为空");
                }
    
                if (string.IsNullOrEmpty(order.Email))
                {
                    ModelState.AddModelError("Email", "Email不能为空");
                }
                else
                {
                    if (!ModelState.IsValidField(order.Email) || !new Regex(@"w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*", RegexOptions.IgnoreCase).IsMatch(order.Email))
                    {
                        ModelState.AddModelError("Email", "Email不是正确的格式");
                    }
                }
    
                if (ModelState.IsValid)
                {
                    order.MerchantId = 46;
                    order.UserMobile = "18210928340";
                    order.DeliveryTypeId = 0;
                    order.ServiceCost = 0;
                    order.DeliveryCost = 0;
                    order.PayCardType = 0;
                    order.Enabled = true;
                    order.IsSettledUp = true;
                    order.HasRecievePay = true;
                    order.HaveGetRecievePay = true;
                    order.Created = DateTime.Now;
                    order.LastModified = DateTime.Now;
                    order.PaySn = "";
                    order.OrderType = 46;
                    order.Satisfaction = 0;
                    orderBll.Add(order);
    
                    //插入ElongOrdersDetails表
                    ElongOrdersDetails detail = new ElongOrdersDetails();
                    detail.OrderGuid = Guid.NewGuid();
                    detail.OrderSn = order.OrderSn;
                    detail.OrderId = 0;
                    detail.Status = order.Status;
                    detail.Created = DateTime.Now;
                    detail.LastModified = DateTime.Now;
                    elongBll.Add(detail);
                    orderBll.Commit();
    
                    return RedirectToAction("Index");
                }
    
                return View();
            }
    
            public ActionResult Details(int id)
            {
                Orders order = orderBll.Find(id);
                return View(order);
            }
    
            public ActionResult Edit(int id)
            {
                Orders order = orderBll.Find(id);
                return View(order);
            }
    
            [HttpPost]
            public ActionResult Edit(Orders orderEdit)
            {
                Orders order = orderBll.Find(orderEdit.Id);
                if (string.IsNullOrEmpty(orderEdit.Email))
                {
                    ModelState.AddModelError("Email", "Email不能为空");
                }
                else
                {
                    if (!ModelState.IsValidField(orderEdit.Email) || !new Regex(@"w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*", RegexOptions.IgnoreCase).IsMatch(orderEdit.Email))
                    {
                        ModelState.AddModelError("Email", "Email不是正确的格式");
                    }
                }
    
                if (ModelState.IsValid) {
                    order.Email = orderEdit.Email;
                    order.Status = orderEdit.Status;
                    order.ServiceCost = orderEdit.ServiceCost;
                    orderBll.Update(order);
                }
                return RedirectToAction("Index");
            }
    
            public ActionResult Delete(int id)
            {
                orderBll.Delete(id);
                return RedirectToAction("Index");
            }
    
            public JsonResult GetEmployees() {
                ResponseBase<List<Employees>> result = new ResponseBase<List<Employees>>();
                try
                {
                    var employees = employeeBll.GetAll().ToList();
                    result.IsSuccess = true;
                    result.Message = "查询成功!";
                    result.resultCode = "200";
                    result.ResultData = employees;
                }
                catch (Exception ex) {
                    result.IsSuccess = false;
                    result.Message = "查询异常!"+ex.Message;
                    result.resultCode = "500";
                }
    
                return Json(result);
            }
    
    
        }
    }
    

    注意到了,我在构造函数中进行了一些初始化,有日志的,有需要用到的BussinessLogic处理类,这些BussinessLogic处理类是依赖NInject注入实例化的,而且这三个处理类是属于不同的UnitOfWork和dbcontext(OrdersBussinessLogic和ElongOrdersDetailsBussinessLogic属于IWedeUnitOfWorks,而EmployeesBussinessLogic属于IXF0816UnitOfWorks)。

    这里要说一下日志,在这个控制器中我把基类的日志初始化为WedeNetLogger,其实要分类打印的日志可以有很多,如:

    根据需要对日志进行分类,并且在控制器的构造函数中根据情况进行初始化。

    Ninject映射

    要配置NInject,就需要先实现一个工厂,如:

    using Ninject;
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    using WedeNet2018.BussinessLogic;
    using WedeNet2018.Infrastructure;
    using WedeNet2018.Infrastructure.Components;
    
    namespace WedeNet2018.Web.Controllers
    {
        /// <summary>
        /// Ninject工厂类
        /// </summary>
        public class NinjectControllerFactory : DefaultControllerFactory
        {
            private IKernel ninjectKernel;
    
            public NinjectControllerFactory()
            {
                ninjectKernel = new StandardKernel();
                AddBindings();
            }
    
            private void AddBindings()
            {
                ninjectKernel.Bind<AbsWedeDBContex>().To<WedeDBContex>();
                ninjectKernel.Bind<IWedeUnitOfWorks>().To<WedeUnitOfWorks<AbsWedeDBContex>>().InSingletonScope();
                ninjectKernel.Bind<OrdersBussinessLogic>().ToSelf();
                ninjectKernel.Bind<ElongOrdersDetailsBussinessLogic>().ToSelf();
                
                ninjectKernel.Bind<AbsXF0816DBContex>().To<XF0816DBContex>();
                ninjectKernel.Bind<IXF0816UnitOfWorks>().To<XF0816UnitOfWorks<AbsXF0816DBContex>>().InSingletonScope();
                ninjectKernel.Bind<EmployeesBussinessLogic>().ToSelf();
            }
    
            protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
            {
                return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);
            }
        }
    }
    

    我在工厂类的AddBindings()方法里进行了各种映射关系配置。

    实现了工厂以后,还需要在Global.asax中注册这个工厂类,如:

    然后,我们就可以使用NInject了。

    MVC4的Bundles

    UI项目里往往需要加载很多js和css,一些通用的可以放在Bundles里让MVC帮忙,如:

    bundles.Add(new ScriptBundle("~/bundles/jss").Include(
    					"~/Scripts/jquery-{version}.js",
    					"~/Bootstrap/js/bootstrap.js",
    					"~/js/common.js",
    					"~/js/layer/layer.js"
    					));
    bundles.Add(new StyleBundle("~/Content/css").Include(
    			"~/Content/site.css",
    			"~/Bootstrap/css/bootstrap.css",
    			"~/Bootstrap/css/bootstrap-grid.css",
    			"~/Bootstrap/css/bootstrap-reboot.css",
    			"~/js/layer/skin/layer.css",
    			"~/js/layer/skin/default/layer.css"
    			));
    

    然后,就可以在视图模板中使用了,如:

    UI展示层主要说明的就这些,另外Bootstrap、layer、jQuery、H5+CSS3内容不介绍了。

  • 相关阅读:
    在子线程中更新ProgressBar为null
    有关ContentProvider及相关一系列的简单用法(持续添加)
    Android内容提供者使用及创建
    Android中关于时间的操作
    Cell的一些坑: UITableViewCell宽度,在iphone5的时候是320,在iphone6的时候为啥也是320?
    处理数据源(根据条目字数多少 ,动态显示一行里有多少个条目,类似天猫搜索历史)
    iOS开发之如何跳到系统设置里的各种设置界面
    Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
    xcode7的那些坑-“Your binary is not optimized for iPhone 5” (ITMS-90096) when submitting
    PresentViewController切换界面(一些系统自带的页面切换动画)
  • 原文地址:https://www.cnblogs.com/zhaow/p/9400965.html
Copyright © 2011-2022 走看看