public JsonResult GetTopSellingProduct(int year) { using(IDataStore ds = new DataStore(_nhibernateSessionFactory)) { return Json(Product.GetTopSellingProduct(ds, year), JsonRequestBehavior.AllowGet); } }
This is how we wanted to return models as JSON even in ASP.NET MVC controller:
public Product GetTopSellingProduct(int year) { using(IDataStore ds = new DataStore(_nhSessionFactory)) { return Product.GetTopSellingProduct(ds, year); } }
Turns out that is possible, Adam Bar noticed ASP.NET MVC can be made to return JSON object implicitly
Here's a complete code that enables ASP.NET Web API-like controller action to ASP.NET MVC. This is using NetJSON for JSON serialization, and DryIoc for IoC/DI needs. DryIoc is the fastest IoC/DI and NetJSON is the fastest JSON serializer
using Erp.Controllers; using DryIoc; // http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison using NJ = NetJSON; // http://theburningmonk.com/2014/08/json-serializers-benchmarks-updated-2/ using System; using System.Linq; namespace Erp { public class MvcApplication : System.Web.HttpApplication { DryIocDependencyResolver _ioc = new DryIocDependencyResolver(); // Customized DefaultControllerFactory protected void Application_Start() { System.Web.Mvc.AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(System.Web.Mvc.GlobalFilters.Filters); RouteConfig.RegisterRoutes(System.Web.Routing.RouteTable.Routes); System.Web.Mvc.ControllerBuilder.Current.SetControllerFactory(_ioc); } } class DryIocDependencyResolver : System.Web.Mvc.DefaultControllerFactory { internal DryIoc.Container _container; public DryIocDependencyResolver() { _container = new DryIoc.Container(); RegisterTheIocs(); } protected override System.Web.Mvc.IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) { System.Web.Mvc.IController ic = controllerType == null ? null : (System.Web.Mvc.IController)_container.Resolve(controllerType); // _container.ResolvePropertiesAndFields(controller); // uncomment this if you want to use DI on controller's properties var mvcController = ic as System.Web.Mvc.Controller; if (mvcController != null) mvcController.ActionInvoker = new SimulateWebApi(); return mvcController; } class SimulateWebApi : System.Web.Mvc.ControllerActionInvoker { const string JsonContentType = "application/json"; protected override System.Web.Mvc.ActionResult CreateActionResult( System.Web.Mvc.ControllerContext controllerContext, System.Web.Mvc.ActionDescriptor actionDescriptor, object actionReturnValue) { if (actionReturnValue == null) return new System.Web.Mvc.EmptyResult(); return (actionReturnValue as System.Web.Mvc.ActionResult) ?? new System.Web.Mvc.ContentResult() { ContentType = JsonContentType, Content = NJ.NetJSON.Serialize (actionReturnValue) }; } } void RegisterTheIocs() { System.Reflection.Assembly assembly = typeof(HomeController).Assembly; foreach (var controller in assembly.GetTypes().Where(t => typeof(System.Web.Mvc.Controller).IsAssignableFrom(t))) { _container.Register(controller, DryIoc.Reuse.InResolutionScope); } _container.Register(typeof(Elmah.Mvc.ElmahController), DryIoc.Reuse.InResolutionScope); // http://ayende.com/blog/153701/ask-ayende-life-without-repositories-are-they-worth-living // http://www.ienablemuch.com/2014/10/typical-nhibernate-sessionfactory-auto-mapping.html _container.RegisterDelegate<NHibernate.ISessionFactory>(x => Erp.DomainMapping.Mapper.SessionFactory, DryIoc.Reuse.Singleton); } }//DefaultControllerFactory }//namespace
JSON Serializers benchmark: http://www.ienablemuch.com/2014/10/benchmarking-net-json-serializers.html
Happy Coding!
No comments:
Post a Comment