Инъекция Ninject и Master Page - PullRequest
2 голосов
/ 30 ноября 2009

Во-первых, я использую Ninject 2.0

У меня есть главная страница, в которую я хотел бы добавить, но я не совсем уверен, как. Я попытался создать класс, производный от System.Web.Mvc.ViewMasterPage, а затем я создал свои свойства:

[Inject]
public ICacheService<List<Category>> Categories { get; set; }
[Inject]
public IConfigurationSettings Config { get; set; }

Когда я запускаю свою страницу, ни одно из свойств не устанавливается и оба имеют нулевое значение. Любые идеи о том, почему или пример, как это сделать? Спасибо

- Обновление

Итак, я провел больше исследований, и, похоже, мне нужно разрешить объекты внутри класса, потому что Ninject не перехватывает создание класса. Итак, теперь мой вопрос: как мне создать распознаватель для моего ядра? Приведенный выше код находится в библиотеке классов, поэтому у меня нет ссылки на ядро. Я попробовал следующее: (слегка изменено с http://www.codethinked.com/post/2009/10/07/Our-Biggest-Enemy-Isne28099t-Developers-Who-Refuse-To-Move-Forward-It-is-Developers-Who-Pretend-To-Move-Forward.aspx)

public class KernelResolver
{
    private static IKernel _kernel;

    public KernelResolver(IKernel kernel)
    {
        _kernel = kernel;
    }

    public static T Resolve<T>()
    {
        return _kernel.Get<T>();
    }
}

и затем зарегистрировано:

Bind<KernelResolver>().ToSelf()

Тем не менее, ядро ​​пустое ... Мне просто нужно увидеть несколько примеров, но я не могу их найти, или может быть, я так растерялся, что не знаю, что ищу: \

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

Ответы [ 2 ]

3 голосов
/ 01 декабря 2009

Я начну с вопроса: почему вы хотите добавить что-либо в главную страницу? Если вы используете MVC, вы действительно хотите использовать модели для передачи данных в ваши представления (включая главную страницу) с помощью контроллера. В этом суть фреймворка MVC, если, возможно, слишком упрощенного.

То, что Ninject или другие контейнеры IoC могут сделать для вас, - это помочь создать классы вашего контроллера и внедрить в них зависимости - действительно, точка интеграции для контейнеров IoC в ASP.Net обычно берет на себя ответственность фабрики контроллеров.

Внедрение соответствующих зависимостей в ваш контроллер может помочь контроллеру в определении подходящей модели или состояния модели для передачи вашим представлениям (включая главную страницу).

Мне нравится думать о шаблоне MVC (и, в этом отношении, ASP.Net MVC), как о возложении ответственности за все процессы принятия решений (т.е. control ) на классы контроллеров. Решения, принимаемые контроллерами, могут быть сформированы многочисленными входными данными (например, конфигурацией, пользовательским вводом, средой и т. Д.), Но в какой-то момент модель передается в представление контроллером. Я думаю о модели, содержащей состояние предмета системы. Представления, на мой взгляд, особенно в ASP.Net MVC, лучше всего рассматривать как лишенные какой-либо логики и больше похожие на «скрипты», чем на настоящие классы или первоклассные гражданки в некоторой объектной модели.

Возможно, у вас есть веская причина для того, чтобы сделать вашу главную страницу представления "умнее", но, как правило, типы объектов, которые вы хотите внедрить, лучше всего вводить в контроллер, а необходимые данные передаются в представление. Мне было бы любопытно узнать больше о том, чего вы пытаетесь достичь.

Примечание: вы можете легко настроить интеграцию Ninject с MVC, чтобы внедрить зависимости всех ваших контроллеров. Проверьте эту StackOverflow вопрос / ответ ветку для деталей.

1 голос
/ 01 декабря 2009

Класс KernelResolver реализует шаблон локатора службы (запрашивая что-то [центральное] для ваших зависимостей), который обычно является скорее последним средством, чем основным подходом. То, что вы действительно хотите, - это чтобы ваша инъекция зависимости работала.

Вы определенно не Bind KernelResolver ни к чему - он действует как общий контейнер, и система (например, фабрики MVC) должна быть подключена, чтобы выручить ее.

Атрибуты [Inject] сами по себе не делают ничего волшебного - они используются Ninject, когда кто-то просит его ввести объект такого типа.

То, что вы ищете, это пример того, как вы говорите MVC, чтобы он вызывал Ninject в нужное время, и я дам вам поиск (например, ninject "asp.net mvc"?).

...