2012-06-03 3 views
0

DI 용 Ninject를 사용하고 IDbContext를 생성자 매개 변수로 내 리포지토리에 주입하고 있습니다. 나는 "서로 다른 ObjectContext 개체에 연결되어 있기 때문에 두 개체 간의 관계를 정의 할 수 없습니다." 문제가 ASP.NET MVC, EF 및 Ninject : 다른 ObjectContext 문제

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

없었다 :

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

이것은 서비스 방법입니다 : 이것은 내 컨트롤러의 액션 메소드입니다

: 이런 일을하려고 오류 동안 비 관련 엔티티를 추가 및 업데이트합니다.

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는 대신 자신의 ControllerFactory의 Ninject.MVC3의 extenison이 필요합니다

이것은 주입 부분이다. 그렇지 않으면 마치 InTransientScope

+0

구현 세부 정보를 제공 할 수 있습니까? MVC3 확장에 대한 기사를 검색했지만 모두 여러분의 것을 포함하여 다양한 방법을 제안합니다. –

+0

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