如何解决城堡温莎控制器工厂和存储库未解决
| 我目前正在测试温莎城堡与Ninject的对决,我真的很喜欢温莎提供的服务,我只是在存储库注入方面遇到问题。 所以,这是设置...我有一个看起来像这样的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。
而且我不知道为什么!我尝试将回购安装程序安装为单例,然后尝试重新排序注册过程,以便在控制器之前进行回购安装。
当我调试并在Global.asax中访问控制器工厂行时,它表示除HomeController之外的所有内容均已正确解析。
有什么想法吗?
解决方法
如果您注册包含接口的存储库
.WithService.DefaultInterface()
您的依赖关系必须基于接口(也许是IRepo)而不是具体接口。
如果您的依赖关系是基于具体的,那么请删除.WithService.DefaultInterface(),这样就可以解决依赖关系了……但这不是最好的方法:对于存储库,总有基于接口的依赖关系
, 我总是讨厌回答自己的问题,但有时必须完成...
这是我错过的一件小而愚蠢的事情!原来,问题出在我的控制器中。我试图将实际的Repo传递给HomeController()构造函数。
我切换到
public ActionResult HomeController(IRepo repo)
{
_repo = repo;
}
那就是工作所需要的... Sheesh ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。