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
- mvc3 framework
- ioc framework – autofac manage object creation dynamically
- moq – unit testing
- entity framework
- 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
Post a Comment