views:

36

answers:

2

I'm trying to create a generic LINQ-TO-SQL repository based on this post which basically lets you define a generic base repository class, then you can define all of your actual repository classes by deriving from the generic base.

I want the option of using a repository with or without passing in the data context, so I decided to create two constructors in the generic base class:

  public abstract class GenericRepository<T, C>
        where T : class
        where C : System.Data.Linq.DataContext, new()
    {
        public C _db;

        public GenericRepository()
        {
            _db = new C();
        }


        public GenericRepository(C db)
        {
            _db = db;
        }


        public IQueryable<T> FindAll()

    ... and other repository functions
   }

To use it, I would derrive my actual repository class:

public class TeamRepository : GenericRepository<Team, AppDataContext> { }

Now, if I try to use this with a parameter:

AppDataContext db = new AppDataContext();
TeamRepository repos=new TeamRepository(db);

I get the error: 'App.Models.TeamRepository' does not contain a constructor that takes 1 arguments

So, it looks like you cant inherit constructors in C#, so, how would you code this so I can call: TeamRepository() or TeamRepository(db)

+1  A: 

You're correct, constructors in C# are not bubbled up into subclasses. You'll have to declare them yourself. In your example, you'll need to surface two constructors for each of your repositories.

Kirk Woll
+3  A: 

Derived classes do not automatically inherit a base class's constructor. You need to explicitly define them.

public class TeamRepository : GenericRepository<Team, AppDataContext>
{
    public TeamRepository() : base() { }
    public TeamRepository(AppDataContext db) : base(db) { }
}
Jeff M
@Jeff M: "Derived classes do not automatically inherit a base classes'." should be "Derived classes do not automatically inherit a base class's constructor."
Merlyn Morgan-Graham
Ah right thanks for that catch. ;)
Jeff M