powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Пример из книги Сандерсона
8 сообщений из 8, страница 1 из 1
Пример из книги Сандерсона
    #38007719
rush.khaz.88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Читаю книгу Сандерсона про ASP.NET MVC3 (стр.151). В связи с этим попрошу разъяснить мне один пример. Сразу скажу, что все работает, но только не понятно каким образом работает.

Не большая часть содержимого файла Global.asax
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
            ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
        }



Реализация NinjectControllerFactory
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class NinjectControllerFactory:DefaultControllerFactory
    {
        private IKernel ninjectKernel;
        public NinjectControllerFactory()
        { ninjectKernel = new StandardKernel();
        AddBindings();
        }
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);
        }
        private void AddBindings()
        {
            Mock<IProductRepository> mock = new Mock<IProductRepository>();
            mock.Setup(m => m.Products).Returns(new List<Product>
                {new Product{Name="Football",Price=25},
                new Product{Name="Surf board",Price=179},
                new Product{Name="Running shoes",Price=95}}.AsQueryable());
            ninjectKernel.Bind<IProductRepository>() .ToConstant(mock.Object);
        }
    }



Класс контроллера
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class ProductController : Controller
    {
        private IProductRepository repository;
        public ProductController(IProductRepository productRepository)
        {
            repository = productRepository;
        }
        
        public ViewResult List()
        {
            return View(repository.Products);
        }
    }



Что из себя представляет IProductRepository
Код: c#
1.
2.
3.
4.
public interface IProductRepository
    {
        IQueryable<Product> Products { get; }
    }



А теперь вопросы:

1.
Откуда метод ninjectKernel.Get знает какой контроллер возвращать, если ранее в него не регистрировалось никаких данных про контроллеры
Код: c#
1.
2.
3.
4.
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);
        }



2. Как фабрика контроллеров вызывает конструтор контроллера ProductController и передает ему параметр productRepository , где это прописано?
Код: c#
1.
2.
3.
4.
public ProductController(IProductRepository productRepository)
        {
            repository = productRepository;
        }
...
Рейтинг: 0 / 0
Пример из книги Сандерсона
    #38008014
Starlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rush.khaz.88
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
        private void AddBindings()
        {
            Mock<IProductRepository> mock = new Mock<IProductRepository>();
            mock.Setup(m => m.Products).Returns(new List<Product>
                {new Product{Name="Football",Price=25},
                new Product{Name="Surf board",Price=179},
                new Product{Name="Running shoes",Price=95}}.AsQueryable());
            ninjectKernel.Bind<IProductRepository>() .ToConstant(mock.Object);
        }



Откуда метод ninjectKernel.Get знает какой контроллер возвращать, если ранее в него не регистрировалось никаких данных про контроллеры


Вот отсюда, добавлены 3 продукта
...
Рейтинг: 0 / 0
Пример из книги Сандерсона
    #38008040
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rush.khaz.88,
откуда знает про контроллер - из контекста запроса ( контроллер вообще может лежать в другой сборке)
как создает - да обыкновенно - активатором
...
Рейтинг: 0 / 0
Пример из книги Сандерсона
    #38008375
rush.khaz.88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Starlex, 3 продукта - это список объектов, а не контроллер. mock.Object выдает имитированную реализацию интерфейса
IProductRepository. По идеи должна регистрироваться Ninject-связь между IController и самой реализацией класса контроллера.
...
Рейтинг: 0 / 0
Пример из книги Сандерсона
    #38008387
rush.khaz.88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи , Хорошо. Вы хотели сказать желаемый контроллер определяется из
Код: c#
1.
Type controllerType

, в таком случае, непонятно для чего применили код:
Код: c#
1.
(IController)ninjectKernel.Get(controllerType);

. Ведь для возвращения контроллера из функции можно применить методы рефлексии, гораздо проще получится
...
Рейтинг: 0 / 0
Пример из книги Сандерсона
    #38008485
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Пример из книги Сандерсона
    #38008533
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rush.khaz.88 Где-то в степи , Хорошо. Вы хотели сказать желаемый контроллер определяется из
Код: c#
1.
Type controllerType

, в таком случае, непонятно для чего применили код:
Код: c#
1.
(IController)ninjectKernel.Get(controllerType);

. Ведь для возвращения контроллера из функции можно применить методы рефлексии, гораздо проще получится
Тип контроллера -> метод определяется из контекста запроса, где в карте роутера вы прописываете какой урл
будет обрабатываться каким контроллером из какого намеспейса.
...
Рейтинг: 0 / 0
Пример из книги Сандерсона
    #38009193
rush.khaz.88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что накопал. Метод Get Ninject'a:
1. Создает экземпляр класса контроллера способом рефлексии (так как он знает тип контроллера);
2. Вместо полей-интерфейсов (в нашем случае это IProductRepository) вставляет конкретную реализацию (конкретный объект), которую мы уже зарегистрировали (ninjectKernel.Bind<IProductRepository>() .ToConstant(mock.Object)).
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Пример из книги Сандерсона
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]