В своих приложениях MVC я использую архитектуру, которую Роб Конери показал в своей серии видеороликов MVC Storefront, и она работает для меня просто очаровательно.
Репозиторий => Сервис + Фильтры => Контроллер => Вид
Я пытался смоделировать то, чего вы хотите достичь, и сумел сделать вот так
Edit1 : изменен IList на IQueryable в репозитории и фильтрах
Репозиторий
public interface IRepository
{
IQueryable<Vote> GetVotes();
IQueryable<Story> GetStories();
}
Сервис для получения того, что вы хотите
public class Service : IService
{
private IRepository _repository;
public Service(IRepository repository)
{
_repository = repository;
if (_repository == null) throw new InvalidOperationException("Repository cannot be null");
}
public IList<Vote> GetUserVotes(int userID)
{
return _repository.GetVotes().WithUserID(userID).ToList();
}
public IList<Story> GetNotVotedStories(IList<Vote> votes)
{
return _repository.GetStories().WithoutVotes(votes).ToList();
}
}
Фильтры для фильтрации ваших историй и голосов пользователей (в основном это методы расширения). Не самая лучшая реализация, но вы можете переписать позже
public static class Filters
{
public static IQueryable<Vote> WithUserID(this IQueryable <Vote> qry, int userID)
{
return from c in qry
where c.UserID == userID
select c;
}
public static IQueryable<Story> WithoutVotes(this IQueryable <Story> qry, IList <Vote> votes)
{
return from c in qry
where votes.Where(x => x.StoryID == c.StoryID).ToList().Count > 0
select c;
}
}
И тогда вы можете передать текущий идентификатор пользователя в контроллер, а не в DAL или View, как вы делали до
public class HomeController : Controller
{
private readonly IRepository _repository;
private readonly IService _service;
public HomeController()
{
_repository = new Repository();
_service = new Service.Service(_repository);
}
public ActionResult Index()
{
var userVotes = _service.GetUserVotes(CurrentUserID);
var unvotedStories = _service.GetNotVotedStories(userVotes);
return View(unvotedStories);
}
}
Это позволяет избежать добавления пользовательского свойства UserVotedOn в модель Story