Until now, we have mostly been registering the components we need in the container, and except for the
instance, we have not used the container much. This is going to change now, as in this part we'll add a new controller to the application along with set of other objects.
We have our
s, let's add ability to actually interact with them. First let's add a new, empty, Controller to the application, and call it
. Let's also add an empty
action which we'll use to list the events set by the user.
public class EventsController : Controller
private readonly IEventRepository events;
public EventsController(IEventRepository events)
this.events = events;
public ActionResult Index(int? page)
var eventPage = events.GetPage(page.GetValueOrDefault(1));
To list the
s we'll use a
(discussed below). We'll also use paging to avoid issues when user has large number of
Page<T> class is very simple and uninteresting. However if you would like to read its code it's available in the solution.
The repository interface for now will have just one method, and it's implementation is very basic. To keep our solution clean we also create a separate folder for out repositories and that's where we put the interface and its implementation.
public interface IEventRepository
Page<Event> GetPage(int pageNumber);
public class EventRepository : IEventRepository
private readonly int pageSize;
private readonly ISession session;
public EventRepository(int pageSize, ISession session)
this.pageSize = pageSize;
this.session = session;
public Page<Event> GetPage(int pageNumber)
var firstResult = pageSize * (pageNumber - 1);
using (var tx = session.BeginTransaction())
var totalCount = session.QueryOver<Event>().ToRowCountQuery().FutureValue<int>();
var events = session.QueryOver<Event>().Take(pageSize).Skip(firstResult).Future();
var page = new Page<Event>(events, pageNumber, totalCount.Value, pageSize);
The implementation is very uninteresting as it's just a NHibernate 101. Let's now move to creating a view to display our events.
If you right click anywhere in the action method and select Add-->View...
you will be presented with a window like that:
We need to make some changes in the view, like changing the model type to
adjusting rest of the template to this change, and adding paging, but that's all beyond the scope of this tutorial. Feel free to inspect the code if you're interested in those details.
We're now almost ready to list our
s. Let's do one last thing - add a link on the home page.
<p>@Html.ActionLink("View your events","Index","Events")</p>
No mention of Windsor
Notice nowhere in the code did we even mention Windsor. That's the Inversion of Control Principle at work - Windsor is out there, and we don't concern ourselves with it, concentrating on what the app is supposed to be doing, not how it's put together and other low level, mundane and uninteresting details.
If you go ahead and try to run the application... it will fail with an exception. Don't worry, it's not your fault. We all learn by making mistakes and in the next part
we'll explore how to diagnose missing dependency exceptions.