16

We are using a bunch of separate classes suffixed with -repository to retrieve the data from the database; for each table its own repository.

We have for instance a customerrepository class which has all kind of methods to retrieve customers, and a vacancyrepository which has all kind of methods to retrieve vacancies.

I have two questions about this way of doing things:

  1. How about getting data which spans multiple tables? For instance I have a screen which shows all customers who have not yet created a vacancy. Can a customerrepository use methods from the vacancyrespository, or do both repositories return results and is there a class higher in the hierarchy (let's name it a dataservice) which gets the results from both repositories and combine them into 1 result?

  2. how much logic can such a repository handle?
    I think it's OK to implement the 'where active == true' in a repository to retrieve only active records, or should even that simple logic be handled by a class higher in the hierarchy (let's name it a dataservice)?

The example I was running into now is this one:

We have a questions list, which contains one or more questions.
The question can have a result, which is hold in a separate table.
So when you want to retrieve the total result of the questions list, you have to combine data from the questionlist table, the question table and the questionstatus table.

Right now we have 3 different repositories for these tables.

If I would ask the questionlistrepository what it's the total result for list number 12, it would have to get data from two other repositories and hence have some logic in it, is that allowed?

Or is there a questionlistdataservice which knows which repositories to use?

One more thing: our repositories can result an IQueryable so a calling service can easily combine the results, but how about when this isn't the case, I don't think it's a good idea to retrieve all the content of all three tables from the database.

1
  • 1
    Typically in multiple table accesses, the dominant table is determined by the table of the record which must exist before the query fetches it. In LEFT OUTER JOIN, that would be the first table mentioned and in RIGHT OUTER JOIN, it would be the second.
    – Neil
    Commented Jan 22, 2013 at 8:48

1 Answer 1

16

Repository returns domain objects and is built on top of mapping layers. For a very simple domain domain objects and database tables can be very much the same.

If your repository is always returning exact representation of your data structure then it might actually be Table Data Gateway aka Data Access Object(DAO).

Example: Your database has tables for person and address. In your application domain address is not an entity of it's own, it is just a property of Person. In this case you would not have PersonRepository and AddressRepository. You just have PersonRepository. Domain should not be concerned how the domain data is persisted. Those responsibilites are in a layer behind repository.

From your example it would seem you actually have DAOs and have just named them Repositories.

3
  • So when creating a repository, i can also have a Table data gateway one level deeper, and our repsoitories are actually TDG's.
    – Michel
    Commented Jan 22, 2013 at 8:37
  • 1
    You could, but weigh the cost and the benefits. Don't get bullied into keeping DAOs and Repositories separate by the principle of code "layering". Do what is most readable in this case. The separation, and the resulting abstraction layer, may be useful if your Repositories tend to do a lot of recombination of the data in the DAOs. Commented Jan 28, 2013 at 1:18
  • 3
    What if I need to get results which combine multiple tables (2 or more)? Where should i put that logic which is not related to a single table?
    – Sergio
    Commented Nov 9, 2020 at 14:47

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.