2010-04-09 4 views
2

그냥 Ninject 2 및 ASP.NET MVC 2를 시작하려고합니다.이 튜토리얼 http://www.craftyfella.com/2010/02/creating-aspnet-mvc-2-controller.html을 따라 Ninject를 사용하여 컨트롤러 팩토리를 만들고 바인드하려면 구체적인 구현에 대한 첫 번째 추상화. 이제는 다른 어셈블리 (구체적으로 SQL 리포지토리가있는 어셈블리)에서 리포지토리 형식을로드하려고합니다.Ninject 2 + ASP.NET MVC 2 외부 어셈블리의 바인딩 유형

Global.asax.cs

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 


     ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory()); 
    } 

컨트롤러 공장 : 여기에 내 코드 그냥 때 지금

public class ExampleConfigModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<Domain.CommunityUserRepository>().To<SQLCommunityUserRepository>(); 
    } 

} 

:에서

public class Kernelhelper 
{ 
    public static IKernel GetTheKernel() 
    { 
     IKernel kernel = new StandardKernel(); 
     kernel.Load(System.Reflection.Assembly.Load("MyAssembly")); 
     return kernel; 
    } 
} 

public class MyControllerFactory : DefaultControllerFactory 
{ 
    private IKernel kernel = Kernelhelper.GetTheKernel(); 


    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 

     return controllerType == null ? null : (IController)kernel.Get(controllerType); 
    } 
} 

는 "하여 MyAssembly"모듈이 내 진입 점에서 MockRepository 객체를 두드리는 것은 잘 작동하지만 저장소가 필요한 컨트롤러는 정상적으로 작동합니다. kernel.Load (System.Reflection.Assembly.Load ("MyAssembly")); 또한 작업을 수행하고 모듈을 등록하지만 저장소를 필요로하는 컨트롤러를 호출하자마자 Ninject에서 ActivationException을 얻습니다.

사용할 수있는 바인딩이없고 해당 유형이 자체 바인딩 할 수 없습니다. 활성화 경로 : AccountController

에 대한 1) 요청 형 AccountController의 생성자의 매개 변수 _rep에 의존 CommunityUserRepository의 2) 주입

사람이 나에게 정말 중요한 측면은 외부 어셈블리에서 바인딩 유형을위한 가장 좋은 방법은 예를 (줄 수 의존성 주사의)? 고맙습니다!

+0

내 구체적인 구현의 생성자에는 연결 문자열이 필요합니다. 이제는 그걸 Ninject에 알려주는 방법을 찾아야합니다 ... – hoetz

답변

0

좋아요, 저는 리팩토링을했는데 이제 실행 중입니다. 모든 것이 발생하는 곳이기 때문에 Global.asax의 코드를 게시 할 것입니다. 난 당신이 내 ControllerFactory 제거있어 볼 수 있듯이 MVC 2

public class MvcApplication : NinjectHttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

    } 

    protected override void OnApplicationStarted() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(System.Reflection.Assembly.GetExecutingAssembly()); 
    } 


    protected override Ninject.IKernel CreateKernel() 
    { 

     var kernel = new StandardKernel(); 
     kernel.Load(new ExampleConfigModule()); 
     return kernel; 
    } 
} 

public class ExampleConfigModule : Ninject.Modules.NinjectModule 
{ 
    public override void Load() 
    { 
     string connectionString = 
      ConfigurationManager.ConnectionStrings 
      ["ConnectionString1"].ConnectionString; 
     string communityUserRepTypeName = 
      ConfigurationManager.AppSettings 
      ["CommunityUserRepositoryType"]; 
     var communityUserRepositoryType = 
      Type.GetType(communityUserRepTypeName, true); 
     Bind<Domain.CommunityUserRepository>().To(communityUserRepositoryType).WithConstructorArgument("conString",connectionString); 
    } 

} 

에 대한 빌드 Ninject.Web.Mvc 최신과 최신 Ninject에이 빌드를 사용하고, NinjectHttpApplication에서 상속 및로드 & 외부 어셈블리를 결합 '입력하십시오. 이제는 설정 파일에서 문자열을 타입 지정하지 않고 더 나은 방법이있을 수 있습니다. 아마도 외부 어셈블리에서 모듈을 선언하고 Ninject가 거기에서 자동로드되도록 할 수는 있지만 여전히 연결 문자열을 전달해야합니다. 구체적인 구현의 생성자. 어쩌면 누군가가 이것에 대한 아이디어를 가지고 있지만, 지금은 괜찮습니다.