2010-12-09 6 views
1

다음과 같은 설정을 사용하면 세 가지 어셈블리가 있습니다.ASP.NET MVC에서 Castle.Windsor에 컨트롤러를 추가 할 수 없습니다

웹 (ASP.NET MVC 3.0 RC1)

모델

지속성 (유창함 NHibernate에, Castle.Windsor)

이 내 ControllerInstaller입니다.

using System; 
using System.Web.Mvc; 

using Castle; 
using Castle.Windsor; 

using Castle.MicroKernel; 
using Castle.MicroKernel.SubSystems; 
using Castle.MicroKernel.Registration; 
using Castle.MicroKernel.SubSystems.Configuration; 

namespace Persistence.Installers 
{ 
    public class ControllerInstaller : IWindsorInstaller 
    { 
     public void Install(IWindsorContainer container, IConfigurationStore store) 
     { 
      container.Register(
      AllTypes 
       .FromAssembly(System.Reflection.Assembly.GetExecutingAssembly()) 
       .BasedOn<IController>() 
       .Configure(c => c.Named(
        c.Implementation.Name.ToLowerInvariant()).LifeStyle.Transient)); 
     } 
    } 
} 

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

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     // Register the Windsor Container 
     ControllerBuilder.Current 
      .SetControllerFactory(typeof(Persistence.Containers.WindsorControllerFactory)); 
    } 

내가 오류

없음을 얻고있다 ... 이것은 global.asax 파일 내 Application_Start입니다

using System; 
    using System.Web; 
    using System.Web.Mvc; 

    namespace Persistence.Containers 
    { 
     /// <summary> 
     /// Utilize Castle.Windsor to provide Dependency Injection for the Controller Factory 
     /// </summary> 
     public class WindsorControllerFactory : DefaultControllerFactory 
     { 
      private readonly Castle.Windsor.IWindsorContainer container; 

      public WindsorControllerFactory() 
      { 
       container = WindsorContainerFactory.Current(); 
      } 

      protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
      { 
       return (IController)container.Resolve(controllerType); 
      } 
     } 
    } 

... 내 ControllerFactory입니다 프로 서비스를 지원하는 구성 요소 ject.Web.Controllers.HomeController를 찾았습니다

GetControllerInstance에 있습니다.

그래서 내가 뭘 잘못하고 있는지, 왜 컨트롤러를 등록 할 수 없는지 잘 모르겠습니다.

답변

1

성 윈저 설치 코드는 모두 웹 프로젝트에 속합니다. 그것은 지속성과 관련이 없습니다.

System.Reflection.Assembly.GetExecutingAssembly() :

은 지속성 어셈블리가 아닌 다음 코드로 웹 어셈블리의 컨트롤러를 등록하려고 당신의 ControllerInstaller 때문에 문제를 일으키는.

그래서 IoC 코드를 웹 프로젝트로 이동하면 컨트롤러가 검색됩니다.

+0

그래서 "FromAssemblyNamed ('nameofWeb.dll')"라고 말하면서 같은 결과를 얻을 수 없습니까? 그런 식으로 일할 특별한 이유가 있습니까? – Ciel

+0

@ Stacey : 내가 [여기] (http://stackoverflow.com/questions/4401244/castle-windsor-ioc-in-an-mvc-application/4402870#4402870)라고 쓴 것처럼, IoC 컨테이너 그것은 지속 레이어와 관련이 없습니다. 지속성 계층은 종종 다른 응용 프로그램간에 공유되지만 지속성 계층은 응용 프로그램이 가질 수있는 다른 모든 종속성을 인식하면 안됩니다. – cspolton

+0

코드를 기술적으로 "FromAssemblyNamed ("Web ")로 변경하여 작동시킬 수는 있지만 솔루션에 코드를 배치하는 최선의 방법을 이해하는 데 도움이되지 않습니다. – cspolton

관련 문제