Возможно, моя идея ошибочна с самого начала.Замок Виндзор, инъекции зависимости возвращают 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
равно нулю. Зачем?
Спасибо!Кажется, мне нужно хорошо прочитать эту часть документов. – Nodiink