城堡windsor控制器工厂和存储库没有解决

时间:2011-05-27 13:33:48

标签: asp.net asp.net-mvc-3 castle-windsor ioc-container

我目前正在测试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之外的所有内容都已正确解析。

思想?

2 个答案:

答案 0 :(得分:3)

如果您注册包含界面的存储库 .WithService.DefaultInterface() 你的依赖必须基于界面(也许是IRepo)而不是具体的。

如果你的依赖是基于具体的,那么删除.WithService.DefaultInterface(),所以依赖将被解析......但这不是最好的方法:因为Repository总是依赖于Interface

答案 1 :(得分:1)

我总是讨厌回答我自己的问题,但有时必须这样做......

这是一个我错过的小而愚蠢的事情!事实证明,问题出在我的控制器中。我试图将实际的Repo传递给我的HomeController()构造函数。

我把它改为

public ActionResult HomeController(IRepo repo)
{
     _repo = repo;
}

这就是它需要工作...... Sheesh ......