asp.net - How to create multiple Repository object inside a Repository class using Unit Of Work? -


i newbie mvc3 application development, currently, need following application technologies requirement

  1. mvc3 framework
  2. ioc framework – autofac manage object creation dynamically
  3. moq – unit testing
  4. entity framework
  5. repository , unit of work pattern of model class

i have gone through many article explore basic idea above points still little bit confused on “repository , unit of work pattern “. understand unit of work pattern followed along repository pattern in order share single db context among repository object, here design :

iunitofwork.cs

public interface iunitofwork : idisposable {     ipermitrepository permit_repository{ get; }     irebaterepository rebate_repository { get; }     ibuildingtyperepository buildingtype_repository { get; }     ieeprojectrepository eeproject_repository { get; }     irebatelookuprepository rebatelookup_repository { get; }     ieeprojecttyperepository eeprojecttype_repository { get; }     void save(); 

}

unitofwork.cs

public class unitofwork : iunitofwork {     #region private members      private readonly ceepmsentities context = new ceepmsentities();     private ipermitrepository permit_repository;     private irebaterepository rebate_repository;     private ibuildingtyperepository buildingtype_repository;     private ieeprojectrepository eeproject_repository;     private irebatelookuprepository rebatelookup_repository;     private ieeprojecttyperepository eeprojecttype_repository;      #endregion      #region iunitofwork implemenation      public ipermitrepository permit_repository     {                 {             if (this.permit_repository == null)             {                 this.permit_repository = new permitrepository(context);             }             return permit_repository;         }     }      public irebaterepository rebate_repository     {                  {             if (this.rebate_repository == null)             {                 this.rebate_repository = new rebaterepository(context);             }             return rebate_repository;         }     } 

}

permitrepository .cs

public class permitrepository : ipermitrepository {   #region private members    private ceepmsentities objectcontext = null;   private iobjectset<permit> objectset = null;    #endregion    #region constructors    public permitrepository()   {   }    public permitrepository(ceepmsentities _objectcontext)   {       this.objectcontext = _objectcontext;       this.objectset = objectcontext.createobjectset<permit>();   }    #endregion    public ienumerable<rebateviewmodel> getrebatesbypermitid(int _permitid)   {      // need implment   } 

}

permitcontroller .cs

public class permitcontroller : controller {     #region private members            iunitofwork ceepmscontext = null;     #endregion      #region constructors      public permitcontroller(iunitofwork _ceepmscontext)     {         if (_ceepmscontext == null)         {             throw new argumentnullexception("object can not null");         }         ceepmscontext = _ceepmscontext;     }      #endregion } 

so here wondering how generate new repository example “testrepository.cs” using same pattern can create more 1 repository object

rebaterepository rebaterepo = new rebaterepository () addressrepository addressrepo  = new addressrepository() 

because , ever repository object want create need object of unitofwork first implmented in permitcontroller class. if follow same in each individual repository class again break priciple of unit of work , create multiple instance of object context.

so idea or suggestion highly appreciated.

thank you

your iunitofwork interface has many responsibilities. each time add new repository, need change iunitofwork interface , of implementations.

instead, how this?

public interface iunitofwork {     int savechanges(); } 

you can implement interface in entity framework objectcontext or dbcontext:

public mycustomcontext : dbcontext, iunitofwork {     // ... class implements savechanges method } 

you can constructor inject unit of work each of repositories. autofac can make same instance shared among multiple repositories used within same httpcontext:

public class permitrepository : ipermitrepository {     #region private members      private readonly iobjectset<permit> _objectset;     private readonly iunitofwork _unitofwork;      #endregion      #region constructors      public permitrepository(iunitofwork unitofwork, iobjectset<permit> objectset)     {           _unitofwork = unitofwork;           _objectset = objectset;     }      #endregion      public ienumerable<rebateviewmodel> getrebatesbypermitid(int _permitid)     {        // need implment     } } 

then, when constructor inject repository controller, iunitofwork automatically constructor injected repository.

public class permitcontroller : controller {     #region private members            private readonly ipermitrepository _permitrepos;     #endregion      #region constructors      public permitcontroller(ipermitrepository permitrepos)     {         if (permitrepos== null)         {             throw new argumentnullexception("permitrepos");         }         _permitrepos = permitrepos;     }      #endregion } 

note when querying data out of repository, you're not doing work, iunitofwork interface not apply here. applies when inserting, updating, , deleting entities, not when selecting them.


Comments

Popular posts from this blog

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -

php - Controller/JToolBar not working in Joomla 2.5 -