2016-12-15 2 views
0

Возможно, моя идея ошибочна с самого начала.Замок Виндзор, инъекции зависимости возвращают null

У меня есть проект MVC5, и я пытаюсь реализовать слой репозитория между моим сайтом и EF (для semplicity, это учебный проект).

У меня есть EF Code First контекст, и Repository класс:

public interface IRepository<TDbContext> : IDisposable where TDbContext : class, new() 

public class Repository<TContext> : IRepository<TContext>, IDisposable where TContext : DbContext, new() 

Тогда у меня есть второй слой, где реализовать дополнительные функции:

public interface ILog<TLogContext> : IRepository<TLogContext> where TLogContext : class, new() 

public class Logger<TContext> : Repository<TContext>, ILog<TContext> where TContext : LogContext, new() 

porpouse является использование родового репозиторий для всех моих контекстов и создавать отдельные контексты и отдельные «второстепенные уровни» для разных областей/областей внутри моего веб-сайта (ведение журнала, управление учетными записями и т. д.), поэтому я могу использовать, если хочу, различные реализации БД.

И это реализация Windsor:

Installer.cs:

public class Installer : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     // Controller 
     container.Register(
      Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient()); 

     // EF, Business 
     container.Register(
      Component.For<IRepository<LogContext>>() 
        .ImplementedBy<Repository<LogContext>>() 
        .LifestylePerWebRequest() 
     ); 

     container.Register(
      Component.For<ILog<LogContext>>() 
        .ImplementedBy<Logger<LogContext>>() 
        .LifestylePerWebRequest() 
     ); 
    } 
} 

ControllerFactory.cs:

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(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path)); 
     } 

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

И в Global.asax:

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 

     // Windsor 
     container = new WindsorContainer().Install(FromAssembly.This()); 

     // ContainerFactory loading 
     ControllerBuilder.Current.SetControllerFactory(new ControllerFactory(container.Kernel)); 
    } 

BaseController.cs:

public class BaseController : Controller 
{ 
    // Services 
    internal ILog<LogContext> Logger { get; set; } 

    public void Test() 
    { 
     var allEvents = Logger.All<Event>(); 
    } 
} 

И ... Logger равно нулю. Зачем?

ответ

2

Недвижимость Logger должно быть public.

Полная документация here, соответствующая деталь:

впрыскивания Свойства зависимостей предназначено быть сделано во время активации компоненты при создании компонента. Ответственность определения того, какие свойства используются для инъекций выполняется по умолчанию через PropertiesDependenciesModelInspector - в IContributeComponentModelConstruction реализации, которая использует все следующие критерии для определения, если свойство представляет собой зависимость:

  • Has «общественность» доступна сеттер
  • является ли свойство экземпляра
  • Если ComponentModel.InspectionBehavior установлен в PropertiesInspectionBehavior.DeclaredOnly, не наследуется
  • не имеет параметров
  • не аннотированный с атрибутом Castle.Core.DoNotWireAttribute

Если свойство соответствует всем этим критериям, для него создается модель зависимостей, и это затем разрешается при разрешении зависимостей компонентов во время активации.

+0

Спасибо!Кажется, мне нужно хорошо прочитать эту часть документов. – Nodiink

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