Итак, после долгих поисков, проб и ошибок мне представили ссылку @ default.kramer, по которой я должным образом перешел!С небольшим количеством проб и ошибок, снова (лучший способ на мой взгляд), мне удалось найти решение, которое я искал.Теперь, пока вы можете перейти по ссылке (и я настоятельно рекомендую это сделать), я собираюсь опубликовать решение моего вопроса по мере его реализации.Надеюсь, это может помочь кому-то с подобной проблемой.
Итак, теперь у меня есть свой класс настройки конфигурации следующим образом:
public static class DispatchConfiguration
{
public static void ConfigureStructureMap(IContainer container, IDispatchConfiguration dispatchConfig)
{
DispatchProcessBatchSize = dispatchConfig.DispatchProcessBatchSize;
ServiceIsActive = dispatchConfig.ServiceIsActive;
...
}
Теперь, прежде чем я использовал файл настроек для получения конфигурациииз файла app.config.Очевидно, это было полезно для обеспечения гибкости в изменении настроек конфигурации, но у меня осталась проблема с невозможностью легко протестировать эти настройки.Скажем, тесты 9/10 требовали, чтобы служба была активной, но один тест хотел проверить «ServiceIsActive = false;», теперь у меня проблемы.
Однако теперь я могу ввести конфигурацию из теста:
[Given(@"Config\.IsServiceActive returns false")]
public void GivenConfig_IsServiceActiveReturnsFalse()
{
var settings = new DispatchSettings
{
ServiceIsActive = false,
DispatchProcessBatchSize = 100,
UpdatedBy = "Unit Test"
};
DispatchConfiguration.ConfigureStructureMap(ObjectFactory.Container, settings);
}
И тогда в реальном мире я могу получить настройки из app.config:
public void Start(String[] args)
{
var dispatchConfig = this.GetDispatchConfiguration();
DispatchConfiguration.ConfigureStructureMap(ObjectFactory.Container, dispatchConfig);
...
}
private IDispatchConfiguration GetDispatchConfiguration()
{
var config = (DispatchSettings)ConfigurationManager.GetSection("DispatchSettings");
return config;
}
И тогда фактический класс конфигурации выглядит следующим образом:
[XmlRoot(ElementName = "DispatchSettings", Namespace = "")]
public sealed class DispatchSettings : IDispatchConfiguration
{
public Int32 DispatchProcessBatchSize { get; set; }
public Boolean ServiceIsActive { get; set; }
...
}
Ради полноты интерфейс выглядит так:
public interface IDispatchConfiguration
{
Int32 DispatchProcessBatchSize { get; }
Boolean ServiceIsActive { get; }
...
}
И, наконец, конфигурацияфайл выглядит следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="DispatchSettings" type="MyNamespace.XmlConfigurator, MyNamespace.Core" />
</configSections>
<DispatchSettings type="MyNamespace.DispatchSettings, MyNamespace.Core">
<ServiceIsActive>True</ServiceIsActive>
<DispatchProcessBatchSize>100</DispatchProcessBatchSize>
</DispatchSettings>
Теперь любой, у кого острый глаз, заметит «MyNamespace.XmlConfigurator».Я нашел это в одной из моих поездок в Google, и этот код позволяет десериализовать конфигурацию Xml в класс по вашему желанию (как показано в этом примере).Итак, чтобы убедиться, что у вас есть полный код для работы этого метода, ниже приведен код для XmlConfigurator.Я не могу вспомнить, где я сталкивался с этим, но большое спасибо человеку, который написал это !!
public sealed class XmlConfigurator : IConfigurationSectionHandler
{
public XmlConfigurator()
{
}
public object Create(object parent, object configContext, XmlNode section)
{
XPathNavigator navigator = null;
String typeName = null;
Type sectionType = null;
XmlSerializer xs = null;
XmlNodeReader reader = null;
try
{
Object settings = null;
if (section == null)
{
return settings;
}
navigator = section.CreateNavigator();
typeName = (string)navigator.Evaluate("string(@type)");
sectionType = Type.GetType(typeName);
xs = new XmlSerializer(sectionType);
reader = new XmlNodeReader(section);
settings = xs.Deserialize(reader);
return settings;
}
finally
{
xs = null;
}
}
}
И вот оно у вас!Я надеюсь, что это позволяет любому, у кого похожая проблема, решить ее, и достаточно ясно, чтобы следовать за ней!