【问题标题】:Castle windsor controller factory and repository not resolvingCastle Windsor 控制器工厂和存储库无法解析
【发布时间】:2011-09-03 10:09:51
【问题描述】:

我目前正在测试 Castle Windsor 与 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"));
    }
}

还有一个看起来像...的 repo 安装程序

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 安装程序安装为单例,并尝试重新排序注册过程,以便在控制器之前设置 repo。

当我在 Global.asax 中调试并点击控制器工厂线时,它说除了 HomeController 之外的所有内容都已正确解决。

想法?

【问题讨论】:

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


    【解决方案1】:

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

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

    我换成了

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

    这就是它工作所需要的......嘘......

    【讨论】:

    • 实际上我回复了您相同的解决方案:-P 很高兴您自己找到了它。与温莎玩得开心!
    【解决方案2】:

    如果您注册包含接口的存储库 .WithService.DefaultInterface() 您的依赖必须基于接口(可能是 IRepo)而不是具体的。

    如果您的依赖项是基于具体的,则删除 .WithService.DefaultInterface() 并且依赖项将得到解决...但这不是最好的方法:因为存储库始终具有基于接口的依赖项

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多