可能我的想法從一開始就是錯誤的。Castle Windsor,依賴注入返回null
我有一個MVC5項目,我正努力在我的網站和EF之間實現一個存儲庫層(對於semplicity來說,這是一個學習項目)。
我有一個EF代碼優先上下文,一個存儲庫類:
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是使用通用爲我的所有上下文創建存儲庫,併爲我的網站(日誌記錄,帳戶管理等)中的不同區域/範圍創建單獨的上下文和單獨的「第二層」,以便我可以使用不同的數據庫實現。
這是溫莎實現:
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