Чак Норрис
- Вопросы
- Ответы
Имя | Неизвестно |
Возраст | Неизвестно |
Сайт | Неизвестно |
Неизвестно | |
Участвует в проекте | 1104 дн., 17 час., 5 мин. |
Последняя активность | 536 дн., 1 час., 55 мин. назад |
Ответы
Перейти к вопросу →
На самом деле тип — это тоже экземпляр объекта. Если нужно просто проверить, что val — это объект, представляющий тип, то можно использовать такой код:
object val = typeof(string);
if(val is Type)
{
Console.WriteLine("It is type!");
}
Перейти к вопросу →
NUnit — аналог JUnit, переписанный на C#, чтобы использовать все фичи .NET. Самый классический и проверенный вариант. Поддерживается многими инструментами и библиотеками, в том числе ReSharper`ом и интергрируется в Visual Studio.
Незаслуженно считается непрогрессивным, вялоразвивающимся и консервативным проектом. Версия 2.5 NUnit, вышедшая в начале мая 2009 включает множество фич и наворотов (обсуждение которых достойно отдельного вопроса), которые по прогрессивности и новомодности позволяют ставить NUnit в один ряд с xUnit и MbUnit.
Еще один интересный факт — следующая версия NUnit (3.0) будет представлять не просто библиотеку, а расширенную платформу для тестирования. Подробнее о планах разработчиков можно прочитать в документе The NUnit 3.0 Extended Testing Platform.
Перейти к вопросу →
Есть такое решение — подписываемся на событие CellContentClick
и в обработчике проверяем что клик произошел именно на ячейке, содержащей ссылку:
//...
dataGridView.CellContentClick += DataGridViewCellContentClick;
//...
private void DataGridViewCellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == LINK_COLUMN_INDEX)
{
// Реагируем на клик...
}
}
Перейти к вопросу →
Есть мнение, что для передачи параметра в команду меню можно использовать такой код:
<MenuItem CommandParameter="{Binding}" .../>
При этом, если сам элемент MenuItem построен без помощи binding, то в команду передастся именно DataContext родительского элемента контекстного меню.
Если же само контекстное меню генерируется с помощью binding, то его DataContext отличается от родительского. Тогда, для получения родительского DataContext нужно использовать код типа
<MenuItem CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=DataContext}" />
Перейти к вопросу →
Нужно установить свойство AllowsTransparency в true. По умолчанию оно равно false и все что должно быть прозрачным отображается черным.
Перейти к вопросу →
В Visual Studio 2005 была возможность экспортировать проект в диаграмму Visio. Но у этого подхода есть недосток — Visio — платный инструмент.
Кроме того, для Visual Studio 2008 такая возможность недоступна. Microsoft предоставляет некоторые сомнительные инструкции по этому поводу.
Перейти к вопросу →
Есть и такое радикальное мнение, что property injection можно использовать всегда. Большая куча свойств лучше большой кучи параметров конструктора. И с эстетической и с практической точки зрения. Единственное неудобство — при создании из IOC контейнера нет гарантии что клиент получает объект, у которого все свойства заполнены. Но на этот случай можно написать метод, проверяющий корректность всех свойств и выкидывающий exception в случае если что-то не проинжектилось. Большинство IOC-контейнеров поддерживают вызов init-методов после создания объекта. В итоге мы получаем: с одной стороны, в ioc контейнере осуществляется «строгая» проверка того что все свойства заполнены; с другой стороны, в любом другом месте (в юнит тестах, напрмер) мы можем легко обойти эту проверку и задавать только те свойства, которые нам нужны.
Перейти к вопросу →
Если определить extensions для примитивных типов double, int и тд то можно интересно работать с единицами измерения и конвертацией:
var результатВМетрах = 5.Метров() + 7.Километров() + 18.Сантиметров();
PS Я не любитель называть методы русскими словами, просто так показалось нагляднее)
Перейти к вопросу →
Нужно объявить в Web.config модуль OpenSessionInViewModule:
<httpModules>
<!-- ... -->
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernateXXX"/>
<!-- ... -->
</httpModules>
Вместо NHibernateXXX пишется актуальная версия NHibernate (например, Spring.Data.NHibernate20 для версии 2.0). Следует помнить, что сессия, которая открывается в начале запроса настроена только на чтение (FlushMode.NEVER) и если попытаться выполнить код типа:
public virtual void UpdateOrInsert(Entity entity)
{
HibernateTemplate.SaveOrUpdate(entity);
}
то получим исключение:
Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
Есть два выхода из этой ситуации:
Установить FlushMode равное AUTO. Но так лучше не делать, потому что в этом случае результаты будут коммититься в базу уже после того, как пользователю вернулся ответ. То есть пользователя невозможно будет уведомить о результате операции.
Обернуть вызов метода DAO в транзакцию. Это можно сделать на уровне слоя доступа к данным или на уровне сервисов, декларативно или программно. Легче всего пометить метод репозитория атрибутом Transaction
:
[Transaction(ReadOnly = false)]
public virtual void UpdateOrInsert(Entity entity)
{
HibernateTemplate.SaveOrUpdate(entity);
}
Чтобы этот вариант заработал нужно включить строку импорта aop-объектов для автоматического распознования объектов с транзакциями:
<tx:attribute-driven transaction-manager="transactionManager"/>
или написать этот xml вручную:
<!-- The rest of the config file is common no matter how many objects you add -->
<!-- that you would like to have declarative tx management applied to -->
<object id="autoProxyCreator" type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop">
</object>
<object id="transactionAdvisor" type="Spring.Transaction.Interceptor.TransactionAttributeSourceAdvisor, Spring.Data">
<property name="TransactionInterceptor" ref="transactionInterceptor"/>
</object>
<!-- Transaction Interceptor -->
<object id="transactionInterceptor" type="Spring.Transaction.Interceptor.TransactionInterceptor, Spring.Data">
<property name="TransactionManager" ref="transactionManager"/>
<property name="TransactionAttributeSource" ref="attributeTransactionAttributeSource"/>
</object>
<object id="attributeTransactionAttributeSource" type="Spring.Transaction.Interceptor.AttributesTransactionAttributeSource, Spring.Data">
</object>
Перейти к вопросу →
Есть такое понятие — Brownfield development. В общем смысле это поддержка и развитие унаследованного (legacy) кода, как правило с ужасной архитектурой и отсутствием модульных тестов.
У Manning есть хорошая книга по этому вопросу — Brownfield Application Development in .NET
Brownfield Application Development in .Net показывает вам как превратить унаследованное приложение в произведение искусства с шаблонами, инструментами и концепциями, которые обычно применяются при разработке нового приложения. Используя существующее приложение как пример, эта книга учит вас применять техники и лучшие практики для получения поддерживаемой и адекватной программы. Начиная с build-процесса и введению модульных тестов, авторы показывают как настроить среду, чтобы можно было вносить итерационные изменения в код, уменьшая связанность компонентов.