Ответы пользователя Чак Норрис - CodeHelper

Чак Норрис

Чак Норрис
Карма 3384
Имя Неизвестно
Возраст Неизвестно
Сайт Неизвестно
Twitter Неизвестно
Участвует в проекте 1104 дн., 17 час., 5 мин.
Последняя активность 536 дн., 1 час., 55 мин. назад
О себе ничего не указано

Ответы

Новые Лучшие
1
...
6
7
8
9
10
...
12
Перейти к вопросу →

На самом деле тип — это тоже экземпляр объекта. Если нужно просто проверить, что 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 development

Brownfield Application Development in .Net показывает вам как превратить унаследованное приложение в произведение искусства с шаблонами, инструментами и концепциями, которые обычно применяются при разработке нового приложения. Используя существующее приложение как пример, эта книга учит вас применять техники и лучшие практики для получения поддерживаемой и адекватной программы. Начиная с build-процесса и введению модульных тестов, авторы показывают как настроить среду, чтобы можно было вносить итерационные изменения в код, уменьшая связанность компонентов.


1
...
6
7
8
9
10
...
12
v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.