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

jcr*_*898 5 asp.net castle-windsor ioc-container asp.net-mvc-3

我目前正在测试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;
    }
}
Run Code Online (Sandbox Code Playgroud)

一个看起来像这样的上下文安装程序

public class ContextInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(AllTypes.FromThisAssembly()
            .Where(t => t.Name == "MyContext"));
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个看起来像......的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));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在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
    }
Run Code Online (Sandbox Code Playgroud)

我家的控制器看起来像......

    public class HomeController : Controller
{
    IMyRepo _repo;

    public HomeController(MyRepo repo)
    {
        _repo = repo;
    }
Run Code Online (Sandbox Code Playgroud)

但无论出于什么原因,当我调试我得到的东西时...这个组件的某些依赖关系无法静态解决.MyProject.Controllers.HomeController正在等待以下依赖项:服务: - 未注册的MyProject.Models.MyRepo.

我无法弄清楚为什么!我尝试将我的repo安装程序安装为singleton,我尝试重新排序注册过程,以便repo在控制器之前进行设置.

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

思考?

Cri*_*ixo 3

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

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