6

컨트롤러 및 해당 종속성이 캐슬을 사용하여 (DI/IoC) 패턴을 따라 등록 될 때 '내 컨트롤러에서이 객체에 대해 정의 된 매개 변수없는 생성자'가 표시됩니다. 윈저. 누군가가 다음을 보면서 그것을 볼 수 없기 때문에 내 오류를 볼 수 있습니까? Global.asax에에 등록IoC Castle Windsor -이 객체에 대해 정의 된 매개 변수없는 생성자 없음

enter image description here

코드

public class MyApplication : System.Web.HttpApplication 
{ 
    public MvcApplication() 
    { 
     this.container = new WindsorContainer().Install(new DependencyInstaller()); 
    } 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), 
     new WindsorActivator(this.container)); 
    } 
} 

내 DI

public class DependencyInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(
      Component.For<IDatabaseFactory>().ImplementedBy<DatabaseFactory>().LifeStyle.PerWebRequest, 
      Component.For<IUnitOfWork>().ImplementedBy<UnitOfWork>().LifeStyle.PerWebRequest, 
      Component.For<IMappingEngine>().ImplementedBy<MappingEngine>().UsingFactoryMethod(() => Mapper.Engine).LifeStyle.Singleton, 
      Component.For<IFirmTasks>().ImplementedBy<FirmTasks>().LifeStyle.PerWebRequest, 
      Classes.FromAssemblyContaining<PersonController>().BasedOn<IController>().LifestyleTransient(), 
      Classes.FromThisAssembly().BasedOn<IHttpController>().LifestyleTransient(), 
      Classes.FromAssemblyNamed("Core.Firm.Tasks").Where(type => type.Name.EndsWith("Tasks")).WithServiceAllInterfaces().LifestylePerWebRequest(), 
      Classes.FromAssemblyNamed("Core.Firm.Repository") 
       .Where(type => type.Name.EndsWith("Repository")).WithServiceAllInterfaces().LifestylePerWebRequest() 
      ); 
    } 
} 

내 컨트롤러

public class PersonController : Controller 
{ 
    private IFirmTasks tasks; 

    public PersonController(IFirmTasks tasks) 
    { 
     this.tasks = tasks; 
    } 

나는 용 애플리케이션을로드 할 때 컨테이너는 디버그시 스크린 샷마다 해결되는 모든 종속성으로 잘로드됩니다.

enter image description here

사람은 거기에 나의 실패가 어디에 있는지 어떤 생각이야 얻었다. 미리 감사드립니다.

답변

8

컨테이너를로드하면 디버그 할 때 스크린 샷마다 해결되는 모든 종속성으로 컨테이너가 잘로드됩니다.

예, 모든 유형이 등록됩니다.

var controller = container.Resolve<PersonController>();을 쓰는 경우 컨트롤러 인스턴스를 가져와야합니다.

귀하의 구현은 Asp.Net WebApi에 유효하며 System.Web.Http.ApiController에만 적용됩니다.

PersonController이 (가) System.Web.Mvc.ControllerSystem.Web.Mvc.DefaultControllerFactory을 상속하므로 코드가 올바르게 작동하지 않습니다. 첫 번째 그림에서 볼 수 있습니다.

Asp.Net MVC 컨트롤러를 만들려면 Global.asax에 사용자 지정 ControllerFactory를 작성하고 주입해야합니다.

//Set the controller builder to use our custom controller factory 
    var controllerFactory = new WindsorControllerFactory(container); 
    ControllerBuilder.Current.SetControllerFactory(controllerFactory); 

당신은 more in this answer on another SO question를 읽을 수 있습니다.

/// <summary> 
/// Controller factory the class is to be used to eliminate hard-coded dependencies 
/// between controllers and other components 
/// </summary> 
public class ControllerFactory : DefaultControllerFactory 
{ 
    private readonly IWindsorContainer container; 

    public WindsorControllerFactory(IWindsorContainer container) 
    { 
     this.container = container; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     container.Release(controller.GetType()); 
    } 

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

이 많이 설명 : 여기에

WindsorControllerFactory의 기본 구현입니다. 덕분에 일리아. –

관련 문제