Невозможно получить доступ к моему репозиторию с помощью Dependency Injection (переменная по-прежнему пуста) - PullRequest
3 голосов
/ 03 февраля 2012

Я пытаюсь получить доступ к своему хранилищу из класса для службы RSS.Поэтому для этого я использовал внедрение зависимостей.

Вот что я делаю в NinjectControllerFactory:

ninjectKernel.Bind<IPostRepositoryFactory>().To<NinjectPostRepositoryFactory>().InSingletonScope(); 

Вот мой класс IPostRepositoryFactory:

public interface IPostRepositoryFactory
{
    IPostRepository GetRepository();
}

public class NinjectPostRepositoryFactory : IPostRepositoryFactory
{
    private readonly IKernel kernel;

    public NinjectPostRepositoryFactory(IKernel kernel)
    {
        if (kernel == null)
            throw new ArgumentNullException("kernel");

        this.kernel = kernel;
    }

    public IPostRepository GetRepository()
    {
        return kernel.Get<IPostRepository>();
    }
}

Вотвызов от моего контроллера:

    public ActionResult Feed(int? page = 1)
    {
        var mgr = new SyndicationManager();
        return mgr.GetFeedResult(page);
    }

Вот класс SyndicationManager:

public class SyndicationManager
{
    [Inject]
    public IPostRepositoryFactory m_PostRepositoryFactory { get; set; }
    private SiteConfiguration m_SiteConfiguration;

    public SyndicationManager()
    {
        m_SiteConfiguration = SiteManager.CurrentConfiguration;
    }

    public ActionResult GetFeedResult(int? page = 1)
    {
        IPostRepository repository = m_PostRepositoryFactory.GetRepository();
        var feed = new SyndicationFeed(m_SiteConfiguration.Name,
                                       m_SiteConfiguration.Description,
                                       new Uri(SiteManager.GetBaseUrl()));

Итак, я начал отладку с моего контроллера действий Feed.Затем происходит доступ к GetFeedResult, и возникает проблема: ошибка в том, что мой m_PostRepositoryFactory всегда равен нулю.

Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Почему вы не используете инжектор конструктора? Это облегчает поиск зависимостей ваших классов, и все решает сбой непосредственно, если какая-либо из зависимостей отсутствует.

Просто используйте пакет nuget ninject.mvc3 для настройки ASP.NET MVC для использования внедрения зависимостей для контроллеров.

И я не вижу использования синглтон-фабрики для поиска хранилища? Почему вы не можете разрешить интерфейс хранилища напрямую?

@ Джехоф прав. ninject не разрешит никаких зависимостей, когда вы создаете объекты самостоятельно. Но, как я сказал: не используйте ядро ​​напрямую, вместо этого настройте MVC3 + NInject правильно.

http://nuget.org/packages/Ninject.MVC3/2.2.2.0

1 голос
/ 03 февраля 2012

Я не эксперт по Ninject, но я использую Unity в качестве DependencyInjection-Framework.Я думаю, что проблема в том, что вы создаете экземпляр SyndicationManager, используя его конструктор по умолчанию.

Вам нужно получить ссылку на SyndicationManager, разрешив его из Ninject-Kernel, иначе зависимости не будут введены.

public ActionResult Feed(int? page = 1)
{
    IKernel kernel =  // get the kernel from somewhere

    var mgr = kernel.Get<SyndicationManager>();
    return mgr.GetFeedResult(page);
}
...