asp.net mvc - Difference between Repository and Service Layer? -
in oop design patterns, difference between repository pattern , service layer?
i working on asp.net mvc 3 app, , trying understand these design patterns, brain not getting it...yet!!
repository layer gives additional level of abstraction on data access. instead of writing
var context = new databasecontext(); return createobjectquery<type>().where(t => t.id == param).first();
to single item database, use repository interface
public interface irepository<t> { iqueryable<t> list(); bool create(t item); bool delete(int id); t get(int id); bool savechanges(); }
and call get(id)
. repository layer exposes basic crud operations.
service layer exposes business logic, uses repository. example service like:
public interface iuserservice { user getbyusername(string username); string getusernamebyemail(string email); bool editbasicuserdata(user user); user getuserbyid(int id); bool deleteuser(int id); iqueryable<user> listusers(); bool changepassword(string username, string newpassword); bool sendpasswordreminder(string username); bool registernewuser(registernewusermodel model); }
while list()
method of repository returns users, listusers()
of iuserservice return ones, user has access to.
in asp.net mvc + ef + sql server, have flow of communication:
views <- controllers -> service layer -> repository layer -> ef -> sql server
service layer -> repository layer -> ef part operates on models.
views <- controllers -> service layer part operates on view models.
edit:
example of flow /orders/byclient/5 (we want see order specific client):
public class ordercontroller { private iorderservice _orderservice; public ordercontroller(iorderservice orderservice) { _orderservice = orderservice; // injected ioc container } public actionresult byclient(int id) { var model = _orderservice.getbyclient(id); return view(model); } }
this interface order service:
public interface iorderservice { ordersbyclientviewmodel getbyclient(int id); }
this interface returns view model:
public class ordersbyclientviewmodel { cientviewmodel client { get; set; } //instead of clientview, in simple project ef client class used ienumerable<orderviewmodel> orders { get; set; } }
this interface implementation. uses model classes , repository create view model:
public class orderservice : iorderservice { irepository<client> _clientrepository; public orderservice(irepository<client> clientrepository) { _clientrepository = clientrepository; //injected } public ordersbyclientviewmodel getbyclient(int id) { return _clientrepository.get(id).select(c => new ordersbyclientviewmodel { cient = new clientviewmodel { ...init values c...} orders = c.orders.select(o => new orderviewmodel { ...init values o...} } ); } }
Comments
Post a Comment