2

Я работаю над этим (http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Five-Adding-logging-support.ashx) Учебник IoC в Castle Windsor, я прошел все предыдущие шаги и, как в предыдущем руководстве, я пытаюсь получить log4net регистратор впрыскивается в мой контроллер через свойство, как следующее:Замок Windsor IoC не вводит log4net в мой контроллер

public class HomeController : Controller 
{ 
    // this is Castle.Core.Logging.ILogger, not log4net.Core.ILogger 
    public ILogger Logger { get; set; } 

    public ActionResult Index() 
    { 
     Logger.Debug("Hello world"); 

     ViewBag.Message = "Hello world"; 

     return View(); 
    } 

} 

, но, к сожалению, в точке исполнения Logger.Debug Logger имеет нулевое значение, так что результаты с нулевым опорным исключением. Хотя, когда я пытаюсь позвонить

var logger = container.Resolve<ILogger>(); 

logger.Debug("Container bootstrapped"); 

внутри регистратора Global.asax полностью разрешен.

Почему Windsor не хочет разрешать зависимость внутри контроллера?


РЕДАКТИРОВАТЬ

Контроллер создается с помощью Windsor

Global.asax

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Web; 
using System.Web.Http; 
using System.Web.Mvc; 
using System.Web.Optimization; 
using System.Web.Routing; 
using Castle.Core.Logging; 
using Castle.Windsor; 
using Castle.Windsor.Installer; 
using FlightManagementSystem.WebPlatform.Configuration.IoC.Windsor.Factories; 

namespace FlightManagementSystem.WebPlatform 
{ 
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801 

    public class MvcApplication : System.Web.HttpApplication 
    { 
     private static IWindsorContainer container; 

     protected void Application_Start() 
     { 
      Debugger.Break(); 

      AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
      AuthConfig.RegisterAuth(); 

      container = new WindsorContainer(); 

      container.Install(FromAssembly.This()); 

      var controllerFactory = new ControllerFactory(container.Kernel); 

      ControllerBuilder.Current.SetControllerFactory(controllerFactory); 

     } 

     protected void Application_End() 
     { 
      container.Dispose(); 
     } 
    } 
} 

ControllerFactory.cs

using System; 
using System.Web; 
using System.Web.Mvc; 
using Castle.MicroKernel; 

namespace FlightManagementSystem.WebPlatform.Configuration.IoC.Windsor.Factories 
{ 
    public class ControllerFactory : DefaultControllerFactory 
    { 
     private readonly IKernel kernel; 

     public ControllerFactory(IKernel kernel) 
     { 
      this.kernel = kernel; 
     } 

     public override void ReleaseController(IController controller) 
     { 
      kernel.ReleaseComponent(controller); 
     } 

     protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
     { 
      if (controllerType == null) 
      { 
       throw new HttpException(404, String.Format(Resources.THE_CONTROLLER_FOR_PATH_0_COULD_NOT_BE_FOUND, requestContext.HttpContext.Request.Path)); 
      } 

      return (IController) kernel.Resolve(controllerType); 
     } 
    } 
} 

ControllerInstaller.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Castle.MicroKernel.Registration; 
using Castle.MicroKernel.SubSystems.Configuration; 
using Castle.Windsor; 

namespace FlightManagementSystem.WebPlatform.Configuration.IoC.Windsor.Installers 
{ 
    public class ControllerInstaller : IWindsorInstaller 
    { 
     public void Install(IWindsorContainer container, IConfigurationStore store) 
     { 
      container.Register 
      (
       Classes.FromThisAssembly() 
       .BasedOn<IController>() 
       .LifestyleTransient() 
      ); 
     } 
    } 
} 

LoggerInstaller.cs

using Castle.Facilities.Logging; 
using Castle.MicroKernel.Registration; 
using Castle.MicroKernel.SubSystems.Configuration; 
using Castle.Windsor; 

namespace FlightManagementSystem.WebPlatform.Configuration.Logger.log4net 
{ 
    public class LoggerInstaller : IWindsorInstaller 
    { 
     public void Install(IWindsorContainer container, IConfigurationStore store) 
     { 
      container.AddFacility<LoggingFacility>(f => f.UseLog4Net()); 
     } 
    } 
} 
+0

Как вы создаете контроллер? –

+0

Контроллер создан через Windsor, я отредактировал основной вопрос, вставил логику создания контроллера – Lu4

+0

Вы добавили и настроили 'LoggingFacility'? –

ответ

3

Это на самом деле не ответить на ваш вопрос, но несколько предложений:

1) Используйте пустой объект туп к предотвращение NRE при регистрации:

ILogger logger = NullLogger.Instance; 
public ILogger Log 
{ 
    get { return logger; } 
    set { logger = value ?? NullLogger.Instance; } 
} 

2) Лесозаготовка объект должен быть добавлен в большинстве случаев на первое - до того, как монтажники зарегистрированы:

container = new WindsorContainer(); 
container.AddFacility<LoggingFacility>(f => f.UseLog4Net()); 
container.Install(FromAssembly.This()); 

Если добавить регистрации объекта позже вы можете потеряли некоторые ценные сообщения во время установки.

Смежные вопросы