Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it wise to use same DbContext with multiple repositories?

Getting deeper with entity framework and repositories in order to enable better testing. Wondering if this is wise though?

public interface IRepository
{
    int SaveChanges();

    void Dispose();
}

using (MyContext context = new MyContext())
{
    TransactionRepository txns = new TransactionRepository(context); // TransactionRepository implement IRepository
    MappingRepository maps = new MappingRepository(context); // MappingRepositoryimplement IRepository

    SomeCommand command = new SomeCommand(txns, maps);
    command.Execute();
}

Each of the repositories is logically different, so in theory could be in different data sources. For now, they use the same database though. Each of the repository classes implements IRepository, and notably SaveChanges() along with some query methods that I've not shown for brevity.

What's a good practice for utilize multiple repositories?

like image 962
RyanW Avatar asked Dec 17 '25 03:12

RyanW


1 Answers

+1 gorilla, some goods points made. I would add the following thoughts.

In web/mvc scenario , I use dozens of repositories and inject the Context into these Repositories. I use a repository base class. I also UoW classes which use a context in constructor. The Unit Of Work Classes contains references to all supported repositories for the context. I also use bounded contexts. Here is a sample blogs from Julie Lerman on the subject. http://www.goodreads.com/author/show/1892325.Julia_Lerman/blog

So yes, it makes perfect sense to use multiple contexts and to use multiple repositories. You may even have multiple Unit of Work classes, although concurrent use of UoW classes is another discussion.

ADDING SAMPLE code as requested: This sample is one of Several LuW classes that inherits from a base LuW class. The current state and DBContext to be use is injected. (or defaulted) The repositories are interfaces from CORE project. The LuW classes are in the DAL project.

the base LuW is something like....

public interface ILuw : ILuwEvent, IDisposable
  {

   IBosCurrentState CurrentState{ get; set; }
   OperationStatus Commit();

   }

The Luw Class itself.

namespace XYZ.DAL
{
public class LuwBosMaster : Luw, ILuwBosMaster
{
    public LuwBosMaster(DbContext context, IBosCurrentState currentState)  
    {
       base.Initialise(context,currentState); 
    }
    public LuwBosMaster()
    {

        base.Initialise(GetDefaultContext(), BosGlobal.BGA.IBosCurrentState);
    }
    public static DbContextBosMaster GetDefaultContext()
    {
     return new DbContextBosMaster("BosMaster");
    }

    //MasterUser with own Repository Class
    private IRepositoryMasterUser _repositoryMasterUser;
    public  IRepositoryMasterUser RepMasterUser
    { get { return _repositoryMasterUser ?? (_repositoryMasterUser = new RepositoryMasterUser(Context, CurrentState)); } }

    //20 other repositories declared adn available within this Luw
    // Some repositories might address several tables other single tables only.
    //  The repositories are based on a base class that common generic behavior for each MODEL object

Im sure you get the basic idea...

like image 86
phil soady Avatar answered Dec 19 '25 19:12

phil soady



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!