Замок Виндзорский контроллер фабрика и хранилище не разрешаются - PullRequest
5 голосов
/ 27 мая 2011

В настоящее время я тестирую Касл Виндзор против 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, было правильно разрешено.

Мысли

Ответы [ 2 ]

3 голосов
/ 28 мая 2011

Если вы регистрируете свой репозиторий, включая интерфейс .WithService.DefaultInterface (), ваша зависимость должна основываться на интерфейсе (возможно, IRepo), а не на бетоне.

Если ваша зависимость основана на бетоне, тогда удалите .WithService.DefaultInterface () и так зависимости будут разрешены ... но это не лучший способ: для репозитория всегда есть зависимость, основанная на интерфейсе

1 голос
/ 28 мая 2011

Я всегда ненавижу отвечать на свой вопрос, но иногда это нужно делать ...

Это маленькая, но глупая вещь, которую я пропустил! Оказывается, проблема была в моих контроллерах. Я пытался передать реальный репо в мой конструктор HomeController ().

Я переключил его на

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

И это было то, что нужно для работы ... Sheesh ...

...