views:

628

answers:

2

Hi, I'm using the Repository Pattern (like the examples in the http://www.asp.net/mvc site) in a ASP.NET MVC application. I have two repositories, one called CategoryRepository an other called ProductRepository. I also use two services, the CategoryService and ProductService to validate and call the repositories methods. I need a list of categories in ProductService, a method that return one is already implemented in the CategoryRepository. My question is, which is the correct way to call the ListCategories method that exists in CategoryRepository from ProductService? I don't want to implement another ListCategories method in the ProductRepository (DRY philosophy). Thanks.

+2  A: 

One option is to provide the ProductService class an instance of CategoryService.

public class ProductService {
    ICategoryService _categoryService = null;

    public ProductService(ICategoryService categoryService) {
        _categoryService = categoryService;
    }
}

You could then access the category listings from the ProductService without having to establish a direct coupling to any specific CategoryService implementation.

Ian Suttle
+2  A: 

I would recommend rolling similar repositories into one service. So if you're creating an e-Commerce application roll up ProductRepository, CategoryRepository etc into something like CatalogService and have it host all repositories that are related.

Chad Moran
+1. In general this leaves you with services that are broken up on business, not entity, lines.
TheDeeno
So what happens when the Catalog Service uses the ProductRepo to update a product and and the CategoryRepo to update a category in one service method? Does that mean the ProductRepo changes are done in one transaction and the CategoryRepo changes are done in another transaction? I always thought that repo operations were discrete unless you allow the ProductRepo to change categories as well. What do people do in the real world?
IanT8