L'unité DI Injecter DbContext avec PerRequestLifetimeManager


J'ai le code suivant qui initialiser les instances de l'Unité:

IUnityContainer container = new UnityContainer();
container.RegisterType<DbContext, VotingSystemContext>(new PerRequestLifetimeManager(), new InjectionConstructor());
container.RegisterType(typeof(IGenericRepository<>), typeof(GenericRepository<>));
container.RegisterType<IUnitOfWork, UnitOfWork>(new PerRequestLifetimeManager());    
container.RegisterTypes(
    AllClasses.FromAssemblies(
        Assembly.GetAssembly(typeof(IUserService)),
        Assembly.GetAssembly(typeof(UserService))),
    WithMappings.FromMatchingInterface,
    WithName.Default, WithLifetime.PerResolve);
DependencyResolver.SetResolver(new Unity.Mvc4.UnityDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);

- Je utiliser PerRequestLifetimeManager j'ai donc suivi la suggestion sur MSDN et d'ajouter une nouvelle ligne à la fin du code ci-dessus:

DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));

Mais après je l'ai placé. Lorsque la page(uniquement en html statique) est chargé j'ai envoyer une requête ajax à mon WebApi constroller que les appels GenericReposirory Get() méthode que jeter de l'erreur: The operation cannot be completed because the DbContext has been disposed.


Sans cette ligne de code, tout fonctionne OK, mais sans le définir, probablement, le contexte ne sera pas en disposer.


Mon UnitOfWork classe:

public class UnitOfWork : IUnitOfWork, IDisposable
{
   private readonly VotingSystemContext _context;
   private bool _disposed;

   //GenericRepository properties

   private void Dispose(bool disposing)
   {
      if (!_disposed)
      {
         if (disposing)
         {
            _context.Dispose();
         }
      }
      _disposed = true;
   }

   public void Dispose()
   {
      Dispose(true);
      GC.SuppressFinalize(this);
   }
}

P. S. j'utilise la dernière version de l'Unité 3.5.1404.


Merci à l'avance.

EDIT:

Méthode Get() de Dépôt:

public sealed class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : BaseEntity
{
public GenericRepository(VotingSystemContext context)
{
_context = context;
_dbSet = context.Set<TEntity>();
}
private readonly DbSet<TEntity> _dbSet;
private readonly VotingSystemContext _context;
public IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "", int? page = null, int? pageSize = null)
{
IQueryable<TEntity> query = _dbSet;
if (filter != null)
{
query = query.Where(filter);
}
List<string> properties = includeProperties.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
properties.ForEach(property =>
{
query = query.Include(property);
});
if (orderBy != null)
{
query = orderBy(query);
}
if (page != null && pageSize != null)
{
query = query.Skip((page.Value - 1) * pageSize.Value).Take(pageSize.Value);
}
return query;
}
//other methods like Delete, Update and GetById
}
}

ApiController de Get() méthode:

public IEnumerable<VotingModel> Get(int page = 1, int size = 10)
{
//get all themes
List<Theme> themes = _themeService.GetAll(page, size);
//convert themes to VotingModel (same model as Theme just without converting system throw an error about serializing object and also add new filed UserName).
List<VotingModel> model = themes.Select(t =>
{
MembershipUser membershipUser = Membership.GetUser(t.UserId ?? -1);
return t.ToVotingModel(membershipUser != null ? membershipUser.UserName : string.Empty);
}).ToList();
return model;
}

Service GetAll() méthode:

public List<Theme> GetAll(int page = 1, int pageSize = 10)
{
return UnitOfWork.ThemeRepository.Get(null, null, "Comments", page, pageSize).ToList();
}
  • Voir votre référentiel Get() code peut aider, ainsi que votre contrôleur.
  • bonjour, j'ai ajouté des informations supplémentaires.
  • J'utilise ce type de soution: thorarin.net/blog/post/2013/02/12/....
  • Je ne vois pas le constructeur(s) pour le UnitOfWork classe. A-t-elle un DbContext injecter? Aussi, le service ont un UnitOfWork injecter? La chaîne semble un peu bancale ici sans plus d'info.
  • pour les deux questions, la réponse est oui.
InformationsquelleAutor Nicolai | 2014-05-02