admax
- Вопросы
- Ответы
Имя | Евгений |
Возраст | Неизвестно |
Сайт | Неизвестно |
@codehelper_ru | |
Участвует в проекте | 1117 дн., 17 час., 54 мин. |
Последняя активность | 418 дн., 10 час., 24 мин. назад |
Ответы
Перейти к вопросу →
Официальное описание:
MVC Turbine — это плагин для ASP.NET MVC, который взаимодействует с нижележащим IoC-контейнером и автоматически разрешает зависимости для контроллеров, движков отображения (view engines), binder`ов, view engines, http-модулей и тд.
Заявленные фичи:
- Темплейты решений Visual Studio 2008 для IoC-контейнеров
- Ninject
- Castle Windsor
- StructureMap
- Unity
- Новый фреймворк времени выполнения для поддержки расширяемости
- Blades (components) — автоматически регистрируемые компоненты, которые загружаются во время выполнения.
- Представлены объекты Core Blades для определения основных runtime-объектов приложения ASP.NET MVC:
- MvcBlade — для MVC-специфичных компонентов (Controllers, View Engines и тд).
- WebBlade — для компонентов пространства имен System.Web components (IHttpModule и тд).
- RoutingBlade — для компонентов, определяющих настройку роутинга.
- RotorContext, который работает с Blades для настройки рантайма.
- Автоматическая регистрация объектов View Engine: любой класс, реализующий IViewEngine регистрируется срвис-локатором и используется в качестве движка отображения.
- Авто регистрация фильтров (MVC Filters) для поддержки constructor injection.
- InferredViewResult для обработки неопределенных action`ов и возврата ошибки 404.
- Работает с ASP.NET MVC на Mono
Сама идея проекта, конечно, выглядит очень привлекательно. И задачи решаются вполне актуальные. Но при близком расмотрении выявляются некоторые нюансы реализации:
- Нет поддержки для Spring.NET (Это самое обидное)
- Нет поддержки знаменитого Comon Service Locator (абстракция над всеми популярными IoC-контейнерами)
- MVC Turbine определяет собственный синтаксис регистрации зависимостей в контейнере, что само по себе сомнительно, учитывая, что в проекте уже используется синтаксис какого-то из IoC-контейнеров.
Перейти к вопросу →
Использование обработчиков (IHttpHandler
) является самым легковесным решением задачи генерации динамического контента как в WebForms так и в ASP.NET MVC. Такое решение будет оптимальным по скорости и потребляемым ресурсам. Однако, решение с помощью контроллеров (стандартный механизм MVC) обладает рядом преимуществ:
- решение с контроллерами лучше вписывается в концепцию MVC и смотрится органичнее;
- в контроллеры проще производить инъекцию зависимостей;
- контроллеры легче тестировать.
Перейти к вопросу →
Роберт К. Мартин, Джеймс В. Ньюкирк, Роберт С. Косс
Быстрая разработка программ. Принципы, примеры, практика. Agile Software Development. Principles, Patterns and Practices
В книге описаны не только методики экстремального программирования, но и общие вопросы архитектуры ПО, принципы проектирования и пакетирования, часто используемые шаблоны (паттерны). Есть много практических примеров. Самое ценное в этой книге — это именно фундаментальные принципы, которыми нужно руководствоваться во время принятия решений по архитектуре и ОО-дизайну.
Перейти к вопросу →
Есть отличие, касающееся «ленивой» загрузки. Метод Load()
никогда не возвращает null
и выбрасывает исключение если соответствующий объект не найден. Но если разрешена ленивая загрузка, то Load()
может вернуть proxy вместо реального объекта. Сама загрузка происходит при попытке доступа к свойствам прокси. Исключение также будет выбрашено не при вызове Load()
, а при обращении к прокси. С другой стороны, Get()
не может вернуть прокси, потому что метод должен проверить, существует ли загружаемый объект.
Если объект уже был загружен, и храниться в кеше сессии, то Load()
вернет объект из кеша без обращения к базе данных, а Get()
обратиться к базе чтобы проверить, существует ли объект.
Есть интересный трюк, основанный на методе Load()
(из книги NHibernate in Action):
using(ISession session = sessionFactory.OpenSession()) {
using( session.BeginTransaction() ) {
Category parent = session.Load<Category>(anId); 1
Console.WriteLine( parent.Id ); 2
Category child = new Category("test"); 3
child.ParentCategory = parent;
session.Save(child); 4
session.Transaction.Commit();
}
}
Тут происходит следующее: 1 загружается объект Category
с помощью метода Load()
(подразумевается, что lazy-init=true
). Так как Load()
возвращает прокси, то обращение к базе не происходит. Далее, выводится идентификатор категории в консоль 2. Свойство Id заполняется также без обращения к базе, потому что идентификатор был передан в метод Load()
1. Затем создается дочерняя категория 3 и связывается с уже загруженной категорией. Сохранение категории 4 вызывает генерацию INSERT-запроса. В итоге мы получаем, что дочерняя категория была добавлена без загрузки родительской категории из базы данных, так как вся работа велась с прокси.
Перейти к вопросу →
Linq To DataSet дает одно серьезное преимущество — возможность писать запросы не в виде строки, а в виде кода на C#/VB. Это означает, что ошибки запроса будут найдены во время компиляции, а не во время выполнения. Кроме того работает автодополнение среды и статическая типизация.
Linq To Sql дает только удобный способ доступа к уже загруженному DataSet. При этом сами операции с данными выполняются при помощи ADO.NET. Если основное проседание производительности происходит на уровне базы данных (фактически уровень ADO.NET), то хочется верить, что применение linq to dataset никак не скажется на производительности (или скажется незначительно).
Если отойти от темы linq, то следует заметить, что применение DataSet для доступа к данным в серьезном приложении не совсем оправдано. DataSet`ы не дают возможности создать богатую предметную область с наследованием, полиморфизмом и прочими фишками. По сути DataSet — это прямое отображение таблицы базы данных. Но не решает (а скорее усугубляет) проблем несоответствия реляционной и объектной парадигмы.
Перейти к вопросу →
Мартин Фаулер
Рефакторинг. Улучшение существующего кода
Классическая книга Мартина Фаулера, основателя понятия «рефакторинг». По сути, в книге нет ничего революционного, много элементарных, очевидных вещей. Но весь этот материал очень полезен для понимания сущности рефакторинга и итерационного развития кода.
Перейти к вопросу →
Напрямую этого сделать нельзя. Предварительно рисунок нужно разместить на каком-нибудь хостинге рисунков.
Вот несколько ссылок:
- http://www.freeimagehosting.net/
- http://imageshack.us/
На самом деле пользоваться хостингом рисунков очень просто. Как правило прямо на главной странице можно сделать upload своего рисунка и получить ссылку на него.
Перейти к вопросу →
Есть хорошая статья по этому поводу, но на английском: Mixing Forms and Windows Security in ASP.NET. Там же есть рабочий пример ASP.NET-сайта.
Перейти к вопросу →
Ctrl + N — появляется небольшое окно с полем ввода, если написать в этом поле название класса из открытого решения и нажать Enter, то этот класс откроется в редакторе. Для поля конечно же работает автодополнение, поэтому обычно достаточно набрать только несколько первых букв названия класса. Очень удобная вещь, позволяет вообще не использовать дерево проектов для навигации по классам.
Перейти к вопросу →
DB Comparer показывает разницу схем в очень удобном виде (работает с Microsoft SQL Server 2005 и 2008). Абсолютно бесплатный.