关注点分离是明智的,因为它使您可以更轻松地单独测试各个部分,因为它们无需处理特定的关注点,例如存储和检索配置的位置和方式。
创建所需配置数据的模型并接受此模型作为依赖项(通过构造函数)可能是明智的,或者如果配置数据足够简单,它可以只是组件本身的一些属性。
在创建模型来传输配置信息的情况下,您可以更轻松地在应用程序的一部分中使用该对象,该部分允许用户与可配置值进行交互。用于配置应用程序的 UI 本身就是一个单独的功能。
这是一个愚蠢的例子。
public class Settings
{
public string SettingOne { get; set; }
public bool SettingTwo { get; set; }
}
public class DAL
{
public Settings Settings { get; private set; }
public DAL(Settings settings)
{
}
}
所以,如果你使用单元测试,你可以通过给它你想要的设置来测试 DAL,而不用打扰管理你的设置的部分(下面是一个 NUnit 测试的轻率示例)。
[Test]
public void Should_do_something_important()
{
// Arrange
var dal = new DAL(new Settings { SettingOne = "whatever", SettingTwo = true });
// Act
var result = dal.DoSomethingImportant();
// Assert
Assert.That(result, Is.Not.Null);
}
现在,在您的应用程序中,您可以拥有一个单独的组件来管理设置(如果您选择...也许您的设置真的很简单,这个额外的步骤是不必要的;这取决于您),您可以对其进行全面测试它自己的。
public class SettingsManager
{
public Settings ReadSettings(string path)
{
// read from the store
}
public void WriteSettings(Settings settings, string path)
{
// write settings to the store
}
}
还有另一个无聊的测试:
[Test]
public void Should_write_settings_to_store()
{
// Arrange
var manager = new SettingsManager();
// Act
var settings = new Settings { SettingOne = "value", SettingsTwo = true };
manager.WriteSettings(settings, @"C:\settings\settings.config");
// Assert
Assert.That(File.Exists(@"C:\settings\settings.config", Is.True));
}
现在在您的应用程序中,您可以执行以下操作将它们组合在一起:
protected DAL DAL { get; private set; }
public void Init()
{
var manager = new SettingsManager();
DAL = new DAL(manager.ReadSettings(@"C:\settings\settings.config"));
}
走这条路的好处现在是你的 DAL 和你的设置管理是分离的。您现在可以独立构建和测试这两个部分。让您的 DAL 专注于 DAL 的东西,而设置管理器则专注于管理设置。