2012-06-03 3 views
0

J'utilise Ninject pour DI et j'injecte IDbContext à mes dépôts en tant que paramètre constructeur. Je reçois un "La relation entre les deux objets ne peut pas être définie car ils sont attachés à différents objets ObjectContext." erreur en essayant de faire quelque chose comme ceci:ASP.NET MVC, EF et Ninject: problème ObjectContext différent

Ceci est mon contrôleur méthode d'action :

public ActionResult BindSpace(int spaceId, int managerId) 
    { 
     Space space = _spaceService.GetSpace(spaceId); 
     Manager manager = _managerService.GetManager(managerId); 

     if (space != null && manager != null) 
     { 
      _spaceService.BindManager(space, manager); 
     } 

     return RedirectToAction("GetSpaceBindingForm", new { id = space.Id }); 
    } 

Ceci est la méthode de service :

public void BindManager(Space space, Manager manager) 
    { 
     if (space != null && manager != null) 
     { 
      space.Managers.Add(manager); 
      _spaceRepo.Update(space); 
     } 
    } 

Il n'y avait pas de problème en ajoutant et en mettant à jour des entités non liées.

Il n'y a pas de problème lors de l'utilisation:

ninjectKernel.Bind<IDbContext>().To<SPBSObjectContext>().InSingletonScope().WithConstructorArgument("nameOrConnectionString", "ShoppingPointBrowsingSystem");

je cherché sur le web et tout le monde met en œuvre et utilise la classe de base abstraite NinjectModule, mais je le code suivant. Qu'est-ce que je fais mal ici?

Ceci est l'injection partie:

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    private IKernel ninjectKernel; 

    public NinjectControllerFactory() 
    { 
     ninjectKernel = new StandardKernel(); 
     AddBindings(); 
    } 

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType); 
    } 

    private void AddBindings() 
    { 
     // HTTP Context 
     ninjectKernel.Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current)); 

     // Context 
     ninjectKernel.Bind<IDbContext>().To<SPBSObjectContext>().InRequestScope().WithConstructorArgument("nameOrConnectionString", "ShoppingPointBrowsingSystem"); 

     // Repositories 
     ninjectKernel.Bind<IRepository<Admin>>().To<EfRepository<Admin>>().InRequestScope(); 
     ninjectKernel.Bind<IRepository<Manager>>().To<EfRepository<Manager>>().InRequestScope(); 
     ninjectKernel.Bind<IRepository<ShoppingCenterSpace>>().To<EfRepository<ShoppingCenterSpace>>().InRequestScope(); 
     ninjectKernel.Bind<IRepository<IndependentStoreSpace>>().To<EfRepository<IndependentStoreSpace>>().InRequestScope(); 
     ninjectKernel.Bind<IRepository<Space>>().To<EfRepository<Space>>().InRequestScope(); 

     // Services 
     ninjectKernel.Bind<IAuthenticationService<Admin>>().To<AdminFormsAuthenticationService>(); 
     ninjectKernel.Bind<IAdminService>().To<AdminService>(); 
     ninjectKernel.Bind<IManagerService>().To<ManagerService>(); 
     ninjectKernel.Bind<IShoppingCenterSpaceService>().To<ShoppingCenterSpaceService>(); 
     ninjectKernel.Bind<IIndependentStoreSpaceService>().To<IndependentStoreSpaceService>(); 
     ninjectKernel.Bind<ISpaceService>().To<SpaceService>(); 
    } 
} 
+0

D'où proviennent les deux instances? – SLaks

+0

D'où 'EFRepository' obtient-il son' IDbContext'. On dirait que chacun crée son propre. –

+0

Ils obtiennent tous le IDbContext injecté en tant que paramètre constructeur. –

Répondre

1

InRequestScope exige la extenison Ninject.MVC3 au lieu d'un propre ControllerFactory. Sinon, il se comporte comme InTransientScope

+0

Pouvez-vous fournir des détails de mise en œuvre? J'ai cherché des articles sur l'extension MVC3, mais tout le monde suggère différentes façons de le faire, y compris le vôtre. –

+0

https://github.com/ninject/ninject.web.mvc/wiki/MVC3 –