asp.net mvc - Service layer repeating functions in repository layer -
i've got asp.net mvc application, , i'm using repository pattern, service-specific repositories. i'm finding setup starting feel repetitive.
my layers this: usercontroller > userservice > userrepository (the repository uses entity framework)
the controller accepts service in constructor testability: public usercontroller(iuserservice userservice)
the service accepts repository: public userservice(iuserrepository)
the user might able update business information, change name, email, delete contact address, etc.
so end things in service:
public class userservice { user createuser(....); user getuserbyid(int id); void updateuser(user user); void deleteuser(user user); business createbusiness(...); business getbusinessbyid(int businessid); void updatebusiness(business business); void deletebusiness(business business); ienumerable<business> getbusinessesbyuserid(); ienumerable<businesstype> getbusinesstypes(); ... ... ... each of these functions call functions in repository layer:
public class userrepository { user createuser(....); user getuserbyid(int id); void updateuser(user user); void deleteuser(user user); business createbusiness(...); business getbusinessbyid(int businessid); void updatebusiness(business business); void deletebusiness(business business); ienumerable<business> getbusinessesbyuserid(); ienumerable<businesstype> getbusinesstypes(); ... ... ... any time need crud/data access operation of sort, find myself doing following:
- add operation repository's interface
- implement , code repository function
- add operation service layer's interface
- implement , code service function call above repository function
this getting cumbersome, when there multiple entities related particular service/repository. multiply multiple repositories , services throughout application...
for background, moved away generic repositories avoid complexity of injecting multiple repositories left , right service and/or controller constructors (or individual service functions).
it seems violating dry, , repeating myself. close can get, or there more efficient way this?? thanks.
first. service layer shouldn't repeat repository functions. instead of userservice.updateuser function, there should userservice.updatebasicdata, userservice.updatepassword taking subset of user object fields. shouldn't expose orm layer objects in service. user object surely has many properties , updateuser function shouldn't change them, shouldn't mistake service consumer, may change them.
second. can still use generic repositories , make repository aggregation injection. example:
public class userrelatedrepositories : iuserrelatedrepositories { irepository<user> user { get; set; } irepository<business> business { get; set; } } and use
userrelatedrepositories.user.create()
Comments
Post a Comment