Code Review Stack Exchange is a question and answer site for peer programmer code reviews. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm curious about the best way to instantiate my repositories. Currently they're in the main controllers constructor method.

I was thinking making separate controllers for inbounds, outbounds, directs then instantiate the correct repository in the controller constructor. But that seems redundant in some ways.

I am wondering if I should have some sort of factory method that will load the proper repository when it's called from the controller. What do you folks think?

Note: I understand that implementing these design patterns are not required to be used for an application this simple but I want to learn it for educational purposes.

Generic repository interface:

namespace DirectOrderTracker.Services
{
    interface IRepository<T1> where T1 : class
    {
        IEnumerable<T1> GetAllSales(string commodity);
        void EditSale(T1 obj);
        void SaveChanges();
    }
}

Main controller:

namespace DirectOrderTracker.Controllers
{
    public partial class GridController : Controller
    {
        private SalesService salesService;
        private DirectRepository directs;
        private InboundRepository inbounds;
        private OutboundRepository outbounds;
        public GridController()
        {
            salesService = new SalesService(new OrdersEntities());

< start >Here is where I want to improve my code:

            directs = new DirectRepository(new OrdersEntities());
            inbounds = new InboundRepository(new OrdersEntities());
            outbounds = new OutboundRepository(new OrdersEntities());

< end >

        }
        /*
         * 
         *OUT-BOUND SALES
         * 
         */
        public ActionResult AllOutBounds([DataSourceRequest] DataSourceRequest request, DateTime? fromDate, DateTime? toDate, string commodity)
        {
            var result = outbounds.GetAllSales(commodity);

            return Json(result.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
        }
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult EditOutBounds([DataSourceRequest] DataSourceRequest request, OutboundSalesViewModel sale)
        {
            if (sale != null && ModelState.IsValid)
            {
                outbounds.EditSale(sale);
                outbounds.SaveChanges();
            }
            return Json(new[] { sale }.ToDataSourceResult(request, ModelState));
        }
        /*
         * 
         *IN-BOUND SALES
         * 
         */
        public ActionResult AllInBounds([DataSourceRequest] DataSourceRequest request, DateTime? fromDate, DateTime? toDate, string commodity)
        {
            var result = inbounds.GetAllSales(commodity);

            return Json(result.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
        }
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult EditInBounds([DataSourceRequest] DataSourceRequest request, InboundSalesViewModel sale)
        {
            if (sale != null && ModelState.IsValid)
            {
                inbounds.EditSale(sale);
                inbounds.SaveChanges();
            }
            return Json(new[] { sale }.ToDataSourceResult(request, ModelState));
        }
        /*
         * 
         *DIRECT SALES
         * 
         */
        public ActionResult AllDirects([DataSourceRequest] DataSourceRequest request, DateTime? fromDate, DateTime? toDate, string commodity)
        {
            var result = directs.GetAllSales(commodity);

            return Json(result.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult EditDirects([DataSourceRequest] DataSourceRequest request, DirectSalesViewModel sale)
        {
            if (sale != null && ModelState.IsValid)
            {
                directs.EditSale(sale);
                directs.SaveChanges();

                sale.Margin = Calculations.MarginCalc(sale.Qty, sale.UNITPRICE, sale.UNITCOST, sale.POFrghtRate);
            }
            return Json(new[] { sale }.ToDataSourceResult(request, ModelState));
        }

        public ActionResult GetSalesPeople()
        {
            return Json(salesService.GetAllSalesPeople(), JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetAllCommodities()
        {
            return Json(salesService.GetAllCommodities(), JsonRequestBehavior.AllowGet);
        }
    }
}

Sample Inbound Repository:

public class InboundRepository : IRepository<InboundSalesViewModel>
    {
        private OrdersEntities entities;
        public InboundRepository(OrdersEntities entities)
        {
            this.entities = entities;
        }
        public IEnumerable<InboundSalesViewModel> GetAllSales(string commodity)
        {
            return entities.CustPOLines
                           .Where(x => x.WAREHOUSE != "~D")
                           .OrderByDescending(x => x.ModifyDate)
                            .Select(s => new InboundSalesViewModel
                            {
                                CustPOLineID = s.CustPOLineID,
                                VendDesc = s.Vendor.VendDesc,
                                FreshouseRefNum = s.FreshouseRefNum,
                                Qty = s.Qty.HasValue ? s.Qty.Value : default(decimal),
                                Cost = s.Cost.HasValue ? s.Cost.Value : default(decimal),
                                CostAlt = default(decimal),
                                PPROREFDATE = s.PPROREFDATE,
                                CarrierDesc = s.CarrierDesc,
                                LineFrghtRate = s.LineFrghtRate.HasValue ? s.Cost.Value : default(decimal),
                                VendPurchPONum = s.VendPurchPONum,
                                POLineComment = s.POLineComment,
                                Commodity = s.Product.Commodity,
                                LoadNumber = s.LoadNumber,
                                ProdDesc = s.Product.ProdDesc,
                                TYPE = s.TYPE,
                                Buyer = s.Buyer
                            })
                        .ToList();
        }

        public void EditSale(InboundSalesViewModel sale) {
            var existingSale = entities.CustPOLines.Find(sale.CustPOLineID);
            existingSale.POLineComment = sale.POLineComment;
            entities.Entry(existingSale).State = EntityState.Modified;
        }

        public void SaveChanges()
        {
            entities.SaveChanges();
        }

    }

Perhaps Dependency Injection is what I'm looking for? http://blog.agilistic.nl/a-step-by-step-guide-to-using-ninject-for-dependancy-injection-in-c-sharp/

share|improve this question
    
Yes, I would suggest reading through a good DI tutorial since it seems like your structure would benefit from it. – Ron Beyer 1 min ago

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.