Quantcast
Channel: URF - Unit of Work & (extensible/generic) Repositories Framework
Viewing all articles
Browse latest Browse all 1539

Updated Wiki: Stored Procedure with Service Pattern Example

$
0
0
Create Stored Procedure Interface

publicinterface INorthwindStoredProcedures
{
    IEnumerable<CustomerOrderHistory> CustomerOrderHistory(string customerID);
    int CustOrdersDetail(int? orderID);
    IEnumerable<CustomerOrderDetail> CustomerOrderDetail(string customerID);
    int EmployeeSalesByCountry(DateTime? beginningDate, DateTime? endingDate);
    int SalesByCategory(string categoryName, string ordYear);
    int SalesByYear(DateTime? beginningDate, DateTime? endingDate);
}

Create partial DataContext and implement Stored Procedure interface

publicpartialclass NorthwindContext : INorthwindStoredProcedures
{
    public IEnumerable<CustomerOrderHistory> CustomerOrderHistory(string customerID)
    {
        var customerIDParameter = customerID != null ?
            new SqlParameter("@CustomerID", customerID) :
            new SqlParameter("@CustomerID", typeof (string));

        return Database.SqlQuery<CustomerOrderHistory>("CustOrderHist @CustomerID", customerIDParameter);
    }

    publicint CustOrdersDetail(int? orderID)
    {
        var orderIDParameter = orderID.HasValue ?
            new SqlParameter("@OrderID", orderID) :
            new SqlParameter("@OrderID", typeof (int));

        return Database.ExecuteSqlCommand("CustOrdersDetail @OrderId", orderIDParameter);
    }

    public IEnumerable<CustomerOrderDetail> CustomerOrderDetail(string customerID)
    {
        var customerIDParameter = customerID != null ?
            new SqlParameter("@CustomerID", customerID) :
            new SqlParameter("@CustomerID", typeof (string));

        return Database.SqlQuery<CustomerOrderDetail>("CustOrdersOrders @CustomerID", customerIDParameter);
    }

    publicint EmployeeSalesByCountry(DateTime? beginningDate, DateTime? endingDate)
    {
        var beginningDateParameter = beginningDate.HasValue ?
            new SqlParameter("@Beginning_Date", beginningDate) :
            new SqlParameter("@Beginning_Date", typeof (DateTime));

        var endingDateParameter = endingDate.HasValue ?
            new SqlParameter("@Ending_Date", endingDate) :
            new SqlParameter("@Ending_Date", typeof (DateTime));

        return Database.ExecuteSqlCommand("EmployeeSalesByCountry @Beginning_Date, @Ending_Date", beginningDateParameter, endingDateParameter);
    }

    publicint SalesByCategory(string categoryName, string ordYear)
    {
        var categoryNameParameter = categoryName != null ?
            new SqlParameter("@CategoryName", categoryName) :
            new SqlParameter("@CategoryName", typeof (string));

        var ordYearParameter = ordYear != null ?
            new SqlParameter("@OrdYear", ordYear) :
            new SqlParameter("@OrdYear", typeof (string));

        return Database.ExecuteSqlCommand("SalesByCategory @CategoryName, @OrdYear", categoryNameParameter, ordYearParameter);
    }

    publicint SalesByYear(DateTime? beginningDate, DateTime? endingDate)
    {
        var beginningDateParameter = beginningDate.HasValue ?
            new SqlParameter("@Beginning_Date", beginningDate) :
            new SqlParameter("@Beginning_Date", typeof (DateTime));

        var endingDateParameter = endingDate.HasValue ?
            new SqlParameter("@Ending_Date", endingDate) :
            new SqlParameter("@Ending_Date", typeof (DateTime));

        return Database.ExecuteSqlCommand("SalesByYear @Beginning_Date, @Ending_Date", beginningDateParameter, endingDateParameter);
    }
}

Implement Service Interface for Stored Procedure Service
This step is for best practices, not required.

publicinterface IStoredProcedureService
{
    IEnumerable<CustomerOrderHistory> CustomerOrderHistory(string customerID);
    int CustOrdersDetail(int? orderID);
    IEnumerable<CustomerOrderDetail> CustomerOrderDetail(string customerID);
}


Create Service to Expose Procedure Calls
This step is for best practices, not required.

publicclass StoredProcedureService : IStoredProcedureService
{
    privatereadonly INorthwindStoredProcedures _storedProcedures;

    public StoredProcedureService(INorthwindStoredProcedures storedProcedures)
    {
        _storedProcedures = storedProcedures;
    }

    public IEnumerable<CustomerOrderHistory> CustomerOrderHistory(string customerID)
    {
        return _storedProcedures.CustomerOrderHistory(customerID);
    }

    publicint CustOrdersDetail(int? orderID)
    {
        return _storedProcedures.CustOrdersDetail(orderID);
    }

    public IEnumerable<CustomerOrderDetail> CustomerOrderDetail(string customerID)
    {
        return _storedProcedures.CustomerOrderDetail(customerID);
    }
}

If Using DI & IoC Framework, Register Bindings


publicstaticvoid RegisterTypes(IUnityContainer container)
{
    container
        .RegisterType<IDataContextAsync, NorthwindContext>(new PerRequestLifetimeManager())
        .RegisterType<IUnitOfWorkAsync, UnitOfWork>(new PerRequestLifetimeManager())
        .RegisterType<IRepositoryAsync<Customer>, Repository<Customer>>()
        .RegisterType<IRepositoryAsync<Product>, Repository<Product>>()
        .RegisterType<IProductService, ProductService>()
        .RegisterType<ICustomerService, CustomerService>()
        .RegisterType<INorthwindStoredProcedures, NorthwindContext>(new PerRequestLifetimeManager())
        .RegisterType<IStoredProcedureService, StoredProcedureService>();
}


Consume Procedures in your Application

publicclass ProcedureController : ApiController
{
    privatereadonly IStoredProcedureService _storedProcedureService;

    public ProcedureController(IStoredProcedureService storedProcedureService)
    {
        _storedProcedureService = storedProcedureService;
    }

    [HttpGet]
    public HttpResponseMessage CustomerOrderHistory(string customerID)
    {
        var customerOrderHistory = _storedProcedureService.CustomerOrderHistory(customerID);
        return Request.CreateResponse(HttpStatusCode.OK, customerOrderHistory);
    }

    [HttpGet]
    public HttpResponseMessage CustomerOrderDetail(string customerId)
    {
        var customerOrderDetails = _storedProcedureService.CustomerOrderDetail(customerId);
        return Request.CreateResponse(HttpStatusCode.OK, customerOrderDetails);
    }
}

Viewing all articles
Browse latest Browse all 1539

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>