c# - Entity repsoitory/service pattern, where to put functionality that needs 2 or more services -
i have created generic repository entity types handles retrieving , adding , deleting data. each entity type has corresponding service class interacts generic repository handle data access.
however many times need retrieve data based on more 1 service , never sure place code. example below code returns list of email addresses ("getemailtrackingaddressgroup" function) using 3 different service. have placed in "groupservice" go in "userservice" aswell.
public class groupservice { irepository<group> grouprepository; public groupservice(irepository<group> grouprepository) { this.grouprepository = grouprepository; } public group getbyid(int id) { return grouprepository.getsingle(g => g.id == id); } public static list<string> getemailtrackingaddressesgroup(int instanceid, int groupid) { myentities entitycontext = new myentities(); usergroupservice usergroupservice = new usergroupservice(new baserepoistory<usergroup>(entitycontext )); userservice userservice = new userservice(new baserepoistory<user>(entitycontext )); list<string> emails = new list<string>(); group productgroup = getbyid(groupid); foreach (usergroup usergroup in usergroupservice.getbygroupid(productgroup.id)) { if (usergroup.emailtracking) emails.add(userservice.getbyuserid(usergroup.userid).username); } return emails; } }
my question is, should try , pick relevant service , place code in there , call other relevant service inside it, or should create new class handles data access when more 1 service involved. example have placed code class might below.
public class datafunctions { public static list<string> getemailtrackingaddressesgroup(int instanceid, int groupid) { myentities entitycontext = new myentities(); groupservice usergroupservice = new groupservice(new baserepoistory<group>(entitycontext )); usergroupservice usergroupservice = new usergroupservice(new baserepoistory<usergroup>(entitycontext )); userservice userservice = new userservice(new baserepoistory<user>(entitycontext )); list<string> emails = new list<string>(); group productgroup = getbyid(groupid); foreach (usergroup usergroup in usergroupservice.getbygroupid(productgroup.id)) { if (usergroup.emailtracking) emails.add(userservice.getbyuserid(usergroup.userid).username); } return emails; } }
the second approach seems make more sense means each service never rely on other services im not sure if going right way. 1 concern have using separate class big , hard manage.
edit - have come third solution, think better previous 2 i'm still uncertain if managing correctly. have created seperate "emailservice" handle data queries needed when handing email functionality in main asp.net web project.
below code new class
//functionality realting data needed when handling emails public class emailservice { myentities entitycontext; aspuserservice aspuserservice; groupservice groupservice; usergroupservice usergroupservice; public emailservice() { entitycontext = new myentities (); aspuserservice = new aspuserservice(new repositorybase<aspnet_users>(entitycontext)); groupservice = new groupservice(new repositorybase<group>(entitycontext)); usergroupservice = new usergroupservice(new repositorybase<usergroup>(entitycontext)); } public list<string> getemailsforproductgroup(int groupid) { list<string> emails = new list<string>(); group productgroup = groupservice.getbyid(groupid); foreach (usergroup usergroup in usergroupservice.getbygroupid(productgroup.id)) { if (usergroup.emailtracking) emails.add(aspuserservice.getbyuserid(usergroup.userid).username); } return emails; } }
if maintenance on application you've never seen before, expect be? since "belongs" group, think putting in group-repo/service right approach. in example, suggest creating new group-repository, extending irepository of group, , create method getting group object, including connection entities. when scaling application, make huge difference, since wont have query database every subobject (n+1 problem).
Comments
Post a Comment