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

Popular posts from this blog

windows - Single EXE to Install Python Standalone Executable for Easy Distribution -

c# - Access objects in UserControl from MainWindow in WPF -

javascript - How to name a jQuery function to make a browser's back button work? -