title: Passing Data Context from Unit of Work Into Repositories
body: <p>I've been using repositories for data access for some time now but have never successfully implemented anything resembling the Unit of Work pattern. I've started a new project for self-education using RavenDB and ASP.NET MVC (details that should be trivial, in theory) and am looking to establish a good way to wrap business transactions (<strong>not</strong> web requests) in their own units of work, but am having some difficulty doing so.</p>
  
  <p>The following code snippet is what I'd <em>like</em> to see:</p>
  
  <pre><code>public class UserService : IUserService
      {
          private readonly IRepository&lt;User&gt; _userRepository;
          private readonly IRepository&lt;Role&gt; _roleRepository;
  
          public UserService(
                 IRepository&lt;User&gt; userRepository, 
                 IRepository&lt;Role&gt; roleRepository)
          {
              _userRepository = userRepository;
              _roleRepository = roleRepository;
          }
  
          public void Register(User user)
          {
              using (var session = UnitOfWork.Begin())
              {
                  _userRepository.Create(user);
                  _roleRepository.AddToRole(user, Role.Public);
                  session.Commit();
              }
          }
      }
  </code></pre>
  
  <p>My first stab at a unit of work interface looks something like this:</p>
  
  <pre><code> public interface IUnitOfWork : IDisposable
      {
          void Commit();
      }
  
      public class UnitOfWork : IUnitOfWork
      {
          private readonly IDocumentSession _session;
  
          public UnitOfWork(IDocumentStore documentStore)
          {
              _session = documentStore.OpenSession("http://from:config");
          }
  
          public void Commit()
          {
              _session.SaveChanges();
          }
  
          public static IUnitOfWork Begin()
          {
              return IoC.GetInstance&lt;IUnitOfWork&gt;();
          }
  
          public void Dispose()
          {
              _session.Dispose();
          }
    }
  </code></pre>
  
  <p>Where I'm stuck is the repositories' access to the database session. As I mentioned, I'd like to wrap <strong>business transactions</strong> in their own units; I'm also not keen on passing the session / context into each method, and most other solutions I've seen use static methods and / or storage in something like the web session. All of these make me a little uncomfortable; is there something key that I'm missing to this whole Unit of Work concept?</p>