Thursday, February 1, 2018

BulkInsert

public void InsertCaller()
        {
            DataSet ds = new DataSet();
            ds.ReadXml("D:\\Sample\\Items");
            BulkInsertMethod(ds.Tables[1], "Category");
            BulkInsertMethod(ds.Tables[1], "Items");
        }
        public void BulkInsertMethod(DataTable dt, string destinationTable)
        {
            string constr = ConfigurationManager.ConnectionStrings["Constr"].ConnectionString;
            using (SqlConnection sqlcon = new SqlConnection(constr))
            {
                using (SqlBulkCopy bulkcopy =new SqlBulkCopy(sqlcon))
                {
                    bulkcopy.DestinationTableName = destinationTable;
                    bulkcopy.ColumnMappings.Add("ID", "ItemID");
                    bulkcopy.ColumnMappings.Add("ItemName", "ItemName");
                    bulkcopy.ColumnMappings.Add("Price", "Price");
                    bulkcopy.ColumnMappings.Add("Qty", "Qty");
                    bulkcopy.ColumnMappings.Add("CategoryID", "CategoryID");
                    bulkcopy.ColumnMappings.Add("Active", "Active");

                    sqlcon.Open();
                    bulkcopy.WriteToServer(dt);
                    sqlcon.Close();
                }
            }
        }

Razor

@model Ism.ShoppingCart.Domain.ItemListViewModel

@{
    ViewBag.Title = "Index";
}

<h2>Items</h2>
<br />
@using (Html.BeginForm())
{
<div class="form-horizontal">
    <h4>Item</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.Label("CategoryID", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-4">
            @Html.DropDownList("CategoryID", null, htmlAttributes: new { @class = "form-control" })
        </div>
        <div class="col-md-4">
            <input type="submit" id="btnsearch" value="Search" class="btn btn-default" />
        </div>
    </div>
</div>
}
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.ItemModel[0].ItemName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ItemModel[0].Price)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ItemModel[0].Qty)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ItemModel[0].CategoryID)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ItemModel[0].Active)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model.ItemModel) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.ItemName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Qty)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CategoryID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Active)
        </td>
        <td>
            @Html.ActionLink("AddtoCart", "AddtoCart", "Cart", new { id=item.ID },null)
        </td>
    </tr>
}

</table>



@model Ism.ShoppingCart.Domain.ItemModel

@{
    ViewBag.Title = "Edit";
}

<h2>Add to Cart</h2>


@using (Html.BeginForm("AddtoCart","Cart"))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4></h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.ID)

        <div class="form-group">
            @Html.LabelFor(model => model.ItemName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ItemName, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
                @Html.ValidationMessageFor(model => model.ItemName, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Price, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
                @Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Qty, htmlAttributes: new { @class = "control-label col-md-2"})
            <div class="col-md-10">
                @Html.EditorFor(model => model.Qty, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
                @Html.ValidationMessageFor(model => model.Qty, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.OrderQty, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.OrderQty, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.OrderQty, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to Item List", "Index", "Item", null, new { @class = "btn btn-success" })
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}


@model IEnumerable<Ism.ShoppingCart.Domain.CartViewModel>

@{
    ViewBag.Title = "Index";
}

<h2>My Cart Items</h2>
<br />
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.ItemID)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ItemName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Qty)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.ItemID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ItemName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Qty)
        </td>
        <td>
            @Html.ActionLink("Delete", "Delete", new { id=item.ID },new { onclick="return confirm('Are you sure you want to delete this?');"})
        </td>
    </tr>
}
    <tfoot>
        <tr>
            <td>Total Value : </td>
            <td>@ViewBag.Total</td>
        </tr>
    </tfoot>
</table>

<div class="row">
    <div class="col-sm-2">
        @Html.ActionLink("Continue Shopping", "Index", "Item", null, new { @class = "btn btn-success" })
        </div>
        <div class="col-sm-2">
            @using (Html.BeginForm("CancelOrder", "Cart", FormMethod.Post))
            { @Html.AntiForgeryToken()  <input type="submit" value="Cancel Order" class="btn btn-danger" />
            }
            <br />
        </div>
        <div class="col-sm-2">
            @using (Html.BeginForm("ConfirmOrder", "Cart", FormMethod.Post))
            {
                @Html.AntiForgeryToken()
                <input type="submit" value="Confirm Order" class="btn btn-success" />
            }
        </div>
    </div>


    @if (ViewBag.Message != null)
    {
        <script>
        window.onload = function() {
            alert("@ViewBag.Message");
        };
        </script>
    }

Constructor Injection

    public static class UnityConfig
    {
        public static void RegisterComponents()
        {
var container = new UnityContainer();

            // register all your components with the container here
            // it is NOT necessary to register your controllers

            // e.g. container.RegisterType<ITestService, TestService>();
            container.RegisterType<IItemBL, ItemBL>();
            container.RegisterType<ICartBL, CartBL>();
            container.RegisterType<IItemDAO, ItemDAO>();
            container.RegisterType<ICartDAO, CartDAO>();

            container.RegisterType<AccountController>(new InjectionConstructor());
            //container.RegisterType<RolesAdminController>(new InjectionConstructor());
            container.RegisterType<ManageController>(new InjectionConstructor());
            //container.RegisterType<UsersAdminController>(new InjectionConstructor());

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        }
    }


using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Ism.ShoppingCart.DataLayer;
using Ism.ShoppingCart.Domain;
using Ism.ShoppingCart.BussinessLogic.Contracts;

namespace ISMShoppingCart.Controllers
{
    public class CartController : Controller
    {

        private IItemBL iItemBL;
        private ICartBL iCartBL;
        public CartController(IItemBL iItemBL, ICartBL iCartBL)
        {
            this.iItemBL = iItemBL;
            this.iCartBL = iCartBL;
        }

        // GET: Cart
        public ActionResult Index()
        {
            HttpCookie getCookie = HttpContext.Request.Cookies["CartID"];
            if (getCookie != null)
            {
                string cartId = getCookie.Value;
                Guid cId = new Guid(cartId);
                return View(this.iCartBL.GetCartItemByCartID(cId));
            }
            return View(this.iCartBL.GetCartItemByCartID(new Guid()));
        }

        public ActionResult AddtoCart(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            ItemModel itemModel = this.iItemBL.GetItemByID(id);
            if (itemModel == null)
            {
                return HttpNotFound();
            }
            return View(itemModel);
        }

        // POST: Item/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken()]
        public ActionResult AddtoCart([Bind(Include = "ID,ItemName,Price,Qty,OrderQty,CategoryID,Active")] ItemModel itemModel)
        {
            if (ModelState.IsValid)
            {
                if (itemModel.OrderQty <= itemModel.Qty)
                {
                    HttpCookie getCookie = HttpContext.Request.Cookies["CartID"];
                    if (getCookie == null)
                    {
                        Guid cartId = Guid.NewGuid();

                        this.iCartBL.CreatCart(new CartModel
                        {
                            CartID = cartId,
                            CreatedDate = System.DateTime.Now,
                            Status = "0"
                        });

                        this.iCartBL.InsertCartItems(new CartItemModel
                        {
                            CartID = cartId,
                            ItemID = itemModel.ID,
                            Qty = itemModel.OrderQty,
                        });

                        HttpCookie Cookie = new HttpCookie("CartID", cartId.ToString());
                        HttpContext.Response.Cookies.Add(Cookie);

                    }
                    else
                    {
                        string cartId = getCookie.Value;
                        Guid cId = new Guid(cartId);
                        this.iCartBL.InsertCartItems(new CartItemModel
                        {
                            CartID = cId,
                            ItemID = itemModel.ID,
                            Qty = itemModel.OrderQty,
                        });

                    }

                    return RedirectToAction("Index");
                }
            }
            return View(itemModel);
        }

        // GET: Cart/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            this.iCartBL.DeleteCartItem(id);
            return RedirectToAction("Index");
        }


        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult CancelOrder()
        {
            HttpCookie getCookie = HttpContext.Request.Cookies["CartID"];
            if (getCookie != null)
            {
                string cartId = getCookie.Value;
                Guid cId = new Guid(cartId);
                this.iCartBL.CancelOrder(cId);
                Response.Cookies["CartID"].Expires = DateTime.Now.AddDays(-1);
            }
           return RedirectToAction("Index", "Item");
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult ConfirmOrder()
        {
            HttpCookie getCookie = HttpContext.Request.Cookies["CartID"];
            if (getCookie != null)
            {
                string cartId = getCookie.Value;
                Guid cId = new Guid(cartId);
                this.iCartBL.ConfirmOrder(cId);
                Response.Cookies["CartID"].Expires = DateTime.Now.AddDays(-1);
                ViewBag.Message = "Your Order Successfully Saved";
            }
            return View("Index");
        }

    }
}



    public class ItemController : Controller
    {
        private IItemBL iItemBL;

        public ItemController(IItemBL iItemBL, ICartBL iCartBL)
        {
            this.iItemBL = iItemBL;
        }

        [HandleError]
        public ActionResult Index(int? id)
        {
            ItemListViewModel model = new ItemListViewModel();
            ViewBag.CategoryID = new SelectList(this.iItemBL.GetCategories(), "ID", "CategoryName");
            model.ItemModel = this.iItemBL.GetAllItems(id);
            return View(model);
        }

        [HttpPost]
        [HandleError]
        public ActionResult Index(ItemListViewModel itemModel)
        {
            int? catId = itemModel.CategoryID != null ? itemModel.CategoryID : null;
            ItemListViewModel model = new ItemListViewModel();
            ViewBag.CategoryID = new SelectList(this.iItemBL.GetCategories(), "ID", "CategoryName");
            model.ItemModel = this.iItemBL.GetAllItems(catId);
            return View(model);
        }
    }

How to Use AutoMapper

using AutoMapper;
using Ism.ShoppingCart.DataLayer;
using Ism.ShoppingCart.DataLayer.Contracts;
using Ism.ShoppingCart.Domain;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ism.ShoppingCart.DataLayer
{
    public class CartDAO : ICartDAO
    {
        private ISM_DBEntities db = new ISM_DBEntities();

        MapperConfiguration cartitemmapper = new MapperConfiguration(config => config.CreateMap<CartItemModel, CartItem>());
        private IMapper icartitemmapper;

        MapperConfiguration modeltocartmapper = new MapperConfiguration(config => config.CreateMap<CartModel, Cart>());
        private IMapper imodeltocartmapper;


        public void CreatCart(CartModel model)
        {
            imodeltocartmapper = modeltocartmapper.CreateMapper();
            Cart cart = imodeltocartmapper.Map<CartModel, Cart>(model);
            db.Carts.Add(cart);
            db.SaveChanges();
        }

        public void InsertCartItems(CartItemModel model)
        {
            icartitemmapper = cartitemmapper.CreateMapper();
            CartItem cartitem = icartitemmapper.Map<CartItemModel, CartItem>(model);
            db.CartItems.Add(cartitem);
            db.SaveChanges();
        }

        public void DeleteCartItem(int? Id)
        {
            CartItem cartItem = db.CartItems.Find(Id);
            db.CartItems.Remove(cartItem);
            db.SaveChanges();
        }

        public List<CartViewModel> GetCartItemByCartID(Guid cartID)
        {
            List<CartViewModel> itemList = new List<CartViewModel>();
            List<CartItem>  listitems = db.CartItems.Where(x => x.CartID == cartID).ToList();

            foreach (var item in listitems)
            {
                CartViewModel obj = new CartViewModel();
                obj.CartID = item.CartID;
                obj.ID = item.ID;
                obj.ItemID = item.ItemID;
                obj.ItemName = item.Item.ItemName;
                obj.Price = item.Item.Price;
                obj.Qty = item.Qty;
                itemList.Add(obj);
            }
            return itemList;
        }

        public void CancelOrder(Guid cartID)
        {
            List<CartItem> cartItem = db.CartItems.Where(x => x.CartID == cartID).ToList();
            foreach (var item in cartItem)
            {
                db.CartItems.Remove(item);
                db.SaveChanges();
            }
         
            Cart cart = db.Carts.Find(cartID);
            db.Carts.Remove(cart);
            db.SaveChanges();
        }

        public void ConfirmOrder(Guid cartID)
        {
            Cart cart = db.Carts.Find(cartID);
            cart.Status="1";

            using (var context = new ISM_DBEntities())
            {
                using (DbContextTransaction transaction = context.Database.BeginTransaction())
                {
                    try
                    {
                        db.Entry(cart).State = EntityState.Modified;
                        db.SaveChanges();

                        List<CartItem> cartItem = db.CartItems.Where(x => x.CartID == cartID).ToList();
                        foreach (var item in cartItem)
                        {
                            Item itemobj = db.Items.Where(x => x.ID == item.ItemID).FirstOrDefault();
                            itemobj.Qty = itemobj.Qty - item.Qty;
                            db.Entry(itemobj).State = EntityState.Modified;
                            db.SaveChanges();
                        }

                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                    }
                }
            }
        }
    }
}


using Ism.ShoppingCart.DataLayer.Contracts;
using Ism.ShoppingCart.Domain;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;

namespace Ism.ShoppingCart.DataLayer
{
    public class ItemDAO : IItemDAO
    {
        private ISM_DBEntities db = new ISM_DBEntities();

        MapperConfiguration mapper = new MapperConfiguration(config => config.CreateMap<Item, ItemModel>());
        private IMapper imapper;

        MapperConfiguration categorymapper = new MapperConfiguration(config => config.CreateMap<Category, CategoryModel>());
        private IMapper icategorymapper;

        public List<ItemModel> GetAllItems(int? id)
        {
            imapper = mapper.CreateMapper();
            List<ItemModel> lst = new List<ItemModel>();
            if (id != null)
            {
                lst = imapper.Map<List<Item>, List<ItemModel>>(db.Items.Where(x => x.CategoryID == id).ToList());
            }
            else
            {
                lst = imapper.Map<List<Item>, List<ItemModel>>(db.Items.ToList());
            }
            return lst;
        }

        public ItemModel GetItemByID(int? Id)
        {
            imapper = mapper.CreateMapper();
            ItemModel item = imapper.Map<Item, ItemModel>(db.Items.Find(Id));
            return item;
        }

        public List<CategoryModel> GetCategories()
        {
            icategorymapper = categorymapper.CreateMapper();
            return icategorymapper.Map<List<Category>, List<CategoryModel>>(db.Categories.ToList());
        }
    }
}

Thursday, October 19, 2017

Dependency Injection In c#

Dependency Injection (DI) is a software design pattern that we can develop loosely couple software component. DI also enables us to better manage future changes, re-usability and other complexity in our software. When we going to develop software loosely coupling is very important concept and it gives us to more flexibility in deployment also. Simply we can say one object supplies the dependencies of another object is DI. So we are not going to create any objects of outside class using new key word inside another class.


According to the above picture Interface is very important thing in DI. All the methods that we can access through interface layer.
There are three types of Dependency Injection
  • ·         Constructor Injection
  • ·         Property Injection
  • ·         Method Injection



Let’s go through above three types with sample codes


Constructor Injection
This is the most commonly used Dependency Pattern.

This pattern is done by supplying the dependency through the class’s constructor when instantiating that class.


public interface IDataLayer
    {
        void DoDataLayerLogic();
    }

    public class DataLayer : IDataLayer
    {
        public void DoDataLayerLogic()
        {
            Console.WriteLine("Data Layer Logic Done");
        }
    }

    public class BussinessLogicLayer
    {
        private IDataLayer _dataLayer;

        public BussinessLogicLayer(IDataLayer dataLayer)
        {
            this._dataLayer = dataLayer;
        }

        public void DoBussinessLogic()
        {
            Console.WriteLine("Service Started");
            this._dataLayer.DoDataLayerLogic();
        }
    }



BulkInsert

public void InsertCaller()         {             DataSet ds = new DataSet();             ds.ReadXml("D:\\Sample\\Items");     ...