As I’ve stated before I’m working on a digg clone to teach myself ASP.NET MVC Inside and out but I’ve hit a road bump that I can’t seem to avoid.
I want to be able to optimize this application as much as possible so I have my DAL which is a bunch of classes of …Repository : Repository. Now to help optimize for performance I have my base repository classes return my ViewData objects so that they can select extra fields needed without having to create an anonymous type.
Stories have Users who have created them and Users have Votes for Stories. Pretty easy DB layout. Now I handle my own membership because the default ASP.NET membership is so bloated. In my view for the list of stories I have to determine if the current user has voted on the story being rendered. Now since I figured data access in the View shouldn’t be happening it should be in either my controller or my DAL. Since I’m already returning ViewData from my DAL i added another property on the StoryViewData type named ‘UserVotedOn’ that returns true if the user has voted on that story.
Problem with this is I have to either A) make the DAL aware of membership or B) pass in the User ID into the query methods on the DAL. Neither of these feel right to me and I’m looking for some good solutions. Any feedback is welcome.
In my MVC apps I’m using architecture that Rob Conery showed on his MVC Storefront video series and it works like charm for me.
Repository => Service + Filters => Controller => View
I’ve tried to simulate what you want to achieve and managed todo like this
Edit1: Changed IList to IQueryable in repository and filters
Repository
Service for getting what you want
Filters to filter your stories and user votes (These are basically extension methods). Not the nicest implementation out there, but you can rewrite later
And then you can pass current UserID in controller, not in DAL or View like you had to do before
This allows you to stay away from adding user related UserVotedOn property to your Story model