admax
- Вопросы
- Ответы
Имя | Евгений |
Возраст | Неизвестно |
Сайт | Неизвестно |
@codehelper_ru | |
Участвует в проекте | 1117 дн., 17 час., 55 мин. |
Последняя активность | 418 дн., 10 час., 24 мин. назад |
Ответы
Перейти к вопросу →
В NUnit используются категории для разграничения тестов. Для определения категории используется атрибут:
[Category("Название категории")]
Соответственно, можно использовать две категории для отделения модульных тестов от интеграционных:
[Category("Unit tests")]
и
[Category("Integration tests")]
Эти атрибуты нужно применить ко всем тестам. Чтобы не копировать текст "Unit tests" и "Integration tests" ко всем классам тестов, обычно создают собственный атрибут, унаследовааный от CategoryAttribute
:
using NUnit.Framework;
public class IntegrationAttribute : CategoryAttribute
{
public IntegrationAttribute() : base("Integration tests")
{
}
}
Перейти к вопросу →
Это указывается в секции context
файла App.config или Web.config:
<configuration>
<configSections>
...
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
</sectionGroup>
...
</configSections>
<spring>
<!-- Здесь можно указать чувствительность к регистру -->
<context caseSensitive="false">
<resource uri="config://spring/objects"/>
<resource uri="db://user:pass@dbName/MyDefinitionsTable"/>
</context>
<objects xmlns="http://www.springframework.net">
...
</objects>
</spring>
</configuration>
Перейти к вопросу →
Для этого можно использовать отдельный logger. Обычно в конфигурации определен только один логгер — root
:
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<!-- Это логгер -->
<root>
<level value="INFO" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
Именно root возвращается, когда получаем логгер по классу. Можно определить свой логгер:
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="ConsoleAppender" />
</root>
<!-- Это новый логгер -->
<logger name="LoggerName">
<level value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
</logger>
</log4net>
Теперь в коде можно получить ссылку на этот логгер:
ILog x = LogManager.GetLogger("LoggerName");
Перейти к вопросу →
Нужно использовать атрибут [TypeConverter(typeof(ExpandableObjectConverter))] на соответствующем свойстве объекта A:
class A
{
[TypeConverter(typeof(ExpandableObjectConverter))]
public B BProperty { get; set; }
}
Перейти к вопросу →
Вот обычный appender для записи в консоль:
<appender name="ConsoleAppender"
type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern
value="%date [%thread] %-5level - %message%newline" />
</layout>
</appender>
Можно использовать BufferingForwardingAppender
для буфферизации сообщений. Такой appender будет писать в консоль пачками по 100 сообщений по мере их накопления.
<appender name="BufferingForwardingAppender"
type="log4net.Appender.BufferingForwardingAppender" >
<bufferSize value="100"/>
<appender-ref ref="ConsoleAppender" />
</appender>
Можно использовать гламурный ColoredConsoleAppender
, который позволяет задать цвет для каждого уровня сообщений.
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="ERROR" />
<foreColor value="White" />
<backColor value="Red, HighIntensity" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern
value="%date [%thread] %-5level - %message%newline" />
</layout>
</appender>
Вся информация взята из log4net Config Examples. Там же можно найти больше примеров конфигураций перечисленных appender`ов.
Перейти к вопросу →
XML-RPC-запрос представляет собой обычный POST-запрос к серверу. Соответственно, сделать это можно так:
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create("URL Сервера");
request.Method = "POST";
// XML-RPC-команда
const string command =
@"<?xml version=""1.0""?>
<methodCall>
<methodName>метод</methodName>
<params>
Параметры
</params>
</methodCall>";
byte[] bytes = Encoding.ASCII.GetBytes(command);
request.ContentLength = bytes.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(bytes, 0, bytes.Length);
}
using(var stream = new StreamReader(request.GetResponse().GetResponseStream()))
{
// Вывод ответа от сервера на консоль.
Console.WriteLine(stream.ReadToEnd());
}
Перейти к вопросу →
В статье Using MVVM with Menus in WPF рассказывается о том, как реализовать контекстное меню в рамках паттерна MVVM. Идея такая — создается собственный класс для хранения параметров пункта меню:
public class MenuItem
{
public string Text { get; set; }
public List<MenuItem> Children { get; private set; }
public ICommand Command { get; set; }
public MenuItem(string item)
{
Text = item;
Children = new List<MenuItem>();
}
}
Используя этот класс, создается дерево данных меню для определенного элемента:
public List<MenuItem> MenuOptions
{
get {
var menu = new List<MenuItem>();
if (SupportedFileFormats.Count > 0)
{
var mi = new MenuItem("O_pen");
foreach(var fl in SupportedFileFormats)
{
var sff = fl;
mi.Children.Add(new MenuItem(fl.Attributes.Description)
{ Command = new DelegatingCommand(() => { LoadFromFormat(sff); })});
}
menu.Add(mi);
}
menu.Add(new MenuItem("Close _All") { Command = new DelegatingCommand(OnCloseAll, () => FileList.Count > 0)});
return menu;
}
}
На стороне xaml создается стиль, который связывает элемент управления пункта меню и наш собственный класс данных:
<Style x:Key="ContextMenuItemStyle">
<Setter Property="MenuItem.Header" Value="{Binding Text}"/>
<Setter Property="MenuItem.ItemsSource" Value="{Binding Children}"/>
<Setter Property="MenuItem.Command" Value="{Binding Command}" />
</Style>
Далее, стиль присваивается конкретному контролу и все работает:
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Image}" Width="16" Height="16" />
<TextBlock Margin="5" HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding Header}" />
<StackPanel.ContextMenu>
<!-- Собственно меню -->
<ContextMenu ItemContainerStyle="{StaticResource ContextMenuItemStyle}" ItemsSource="{Binding MenuOptions}" />
</StackPanel.ContextMenu>
</StackPanel>
Перейти к вопросу →
Конечно предпочтительнее использовать constructor injection. Но есть некоторые проблемы.
- Конструктор класса может вызываться в нескольких местах, а не только в IOC-контейнере. При этом по мере добавления в класс все новых и новых зависимостей придется менять все участки кода где вызывается конструктор. В этом случае property injection для некоторых зависимостей выглядит удобнее.
- Класс может требовать так много зависимостей, что конструктор будет выглядеть ужасно принимая все эти параметры.
Перейти к вопросу →
Можно использовать Quartz.NET для запуска периодически выполняющихся задач. В Spring.NET есть классы-обертки, которые позволяют легко создавать задачи и триггеры в контейнере. Вот статья по этому поводу: Using Quartz.NET, Spring.NET and NHibernate to run Scheduled Tasks in ASP.NET
Перейти к вопросу →
Нужно создать документ (класс Document
), заполнить дерево данных и использовать класс XMLOutputter
для записи этого документа в поток. Пример:
Document document = new Document();
//...
XMLOutputter outputter = new XMLOutputter();
try {
outputter.output(document, stream);
} catch (IOException e) {
System.err.println(e);
}
Здесь больше примеров и объяснений: Writing XML Documents with JDOM