2012-06-03 111 views
0

我使用Ninject进行DI,并将IDbContext注入到我的存储库中作为构造函数参数。我得到一个“两个对象之间的关系无法定义,因为它们连接到不同的ObjectContext对象。”错误,同时试图做这样的事情:ASP.NET MVC,EF和Ninject:不同的ObjectContext问题

这是我的控制器的操作方法

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 }); 
    } 

这是服务方法

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

完全没问题同时添加和更新非相关实体。

有没有问题,当我使用:

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

我在网上搜索,每个人都实现,并使用NinjectModule抽象基类,但我有下面的代码。我在这里做错了什么?

这是注入部分:

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

这两个实例从哪里来? – SLaks

+0

“EFRepository”从哪里获取其“IDbContext”。在我看来,每个人都在创造自己的。 –

+0

它们都获取注入为构造函数参数的IDbContext。 –

回答

1

InRequestScope需要Ninject.MVC3 extenison,而不是自己的ControllerFactory。否则,其行为如同InTransientScope

+0

你能提供一些实现细节吗?我搜索了一些关于MVC3扩展的文章,但是每个人都会提出不同的方法来完成它,包括你的。 –

+0

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