我目前正在测试Castle Windsor vs. Ninject,我非常喜欢Windsor提供的产品,我只是遇到了存储库注入的问题。
所以,这是设置......我有一个看起来像这样的ControllersInstaller ......
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(FindControllers().Configure(ConfigureControllers()));
}
private BasedOnDescriptor FindControllers()
{
return AllTypes.FromThisAssembly()
.BasedOn<IController>()
.If(Component.IsInSameNamespaceAs<HomeController>())
.If(t => t.Name.EndsWith("Controller"));
}
private ConfigureDelegate ConfigureControllers()
{
return c => c.LifeStyle.Transient;
}
}
看起来像这样的上下文安装程序......
public class ContextInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Where(t => t.Name == "MyContext"));
}
}
一个看起来像......的回购安装程序。
public class RepoInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Where(type => type.Name.EndsWith("Repo"))
.WithService.DefaultInterface()
.Configure(c => c.LifeStyle.Singleton));
}
}
然后在Global.asax中我通过......注册它们。
private static void BootstrapContainer()
{
var container = new WindsorContainer() // Create a container to hold the dependencies
.Install(
new ContextInstaller(),
new RepoInstaller(),
new ControllersInstaller()
); // Scan this assembly for all IWindsorInstaller
var controllerFactory = new WindsorControllerFactory(container.Kernel); // Create a new instance
ControllerBuilder.Current.SetControllerFactory(controllerFactory); // Use my factory instead of default
}
我的家庭控制器看起来像......
public class HomeController : Controller
{
IMyRepo _repo;
public HomeController(MyRepo repo)
{
_repo = repo;
}
但无论出于什么原因我调试的东西都得到了...... 无法静态解析此组件的某些依赖项。 MyProject.Controllers.HomeController正在等待以下依赖项:服务: - 未注册的MyProject.Models.MyRepo。
我无法弄明白为什么!我尝试将我的repo安装程序安装为singleton,我尝试重新安排注册过程,以便repo在控制器之前进行设置。
当我调试并点击Global.asax中的控制器工厂线时,它表示除HomeController之外的所有内容都已正确解析。
思想?
答案 0 :(得分:3)
如果您注册包含界面的存储库 .WithService.DefaultInterface() 你的依赖必须基于界面(也许是IRepo)而不是具体的。
如果你的依赖是基于具体的,那么删除.WithService.DefaultInterface(),所以依赖将被解析......但这不是最好的方法:因为Repository总是依赖于Interface
答案 1 :(得分:1)
我总是讨厌回答我自己的问题,但有时必须这样做......
这是一个我错过的小而愚蠢的事情!事实证明,问题出在我的控制器中。我试图将实际的Repo传递给我的HomeController()构造函数。
我把它改为
public ActionResult HomeController(IRepo repo)
{
_repo = repo;
}
这就是它需要工作...... Sheesh ......