1

我有一个容器类,其参数来自不同类型的配置文件(例如文本或 xml)。

所以我为 textConfigurationFiles 创建了一个类,为 xmlConfigurationFiles 创建了一个类(我想我稍后会为此实现一个接口 IConfigFile)。

我的容器类的初始化如下所示:

ContainerClass myContainer = new ContainerClass();
myTextConfig = new TextConfig(textFile);
myContainer.ParameterA = myTextConfig.ParameterA;
myContainer.ParameterB = myTextConfig.ParameterB;
myContainer.ParameterC = myTextConfig.ParameterC;

或用于 xml

ContainerClass myContainer = new ContainerClass();
myXMLConfig = new XMLConfig(xmlFile);
myContainer.ParameterA = myXMLConfig.ParameterA;
myContainer.ParameterB = myXMLConfig.ParameterB;
myContainer.ParameterC = myXMLConfig.ParameterC;

但是我不想分配每个值,而是进行某种转换。现在我不知道我是否应该实现一个类型转换或只是一个返回 ContainerClass 对象的简单方法?

myContainer = myTextConfig.ConvertToContainer();

或者

myContainer = (ContainerClass)myTextConfig;

你的建议是什么?

因为我正在尝试实现单一职责原则,所以我希望我的 ContainerClass 代表一个简单的 Container。所以我想像

ContainerClass myContainer = new ContainerClass(configFile);

会与 SRP 决裂吗?

也许我应该提一下,我的 ContainerClass 是由文本xml 文件初始化的;这并不是说参数来自文本xml 文件。


[编辑:附加信息]

ContainerClass 表示具有数据库配置信息(路径、名称等)的容器。

textFile 表示数据库配置。

xmlFile 也包含一个数据库配置,但比我的 textFile 具有更多(数据库配置)参数。

我在想某事。喜欢:

IConfig        config    = new TextFileConfig(fileName);
ContainerClass container = config.ConverToContainer();

或者

IConfig        config    = new TextFileConfig(fileName);
ContainerClass container = (ContainerClass)config;

在文本文件配置中:

public class TextFileConfig : IConfig
{
    ContainerClass container;

    //
    // Constructor
    //
    public TextFileConfig(string fileName)
    {
        //
        // Initialize all values from file fileName
        //
        ...

        //
        // Initialize container with standard values
        //
        container = new ContainerClass();

        //
        // Merge container with values from textFile
        //
        ...

        //
        // Now container contains all values from textFile,
        // all missing parameters are initialized with
        // standard values.
        //
    }


    public ContainerClass ConvertMethodOrTypecastThatsTheQuestion()
    {
        return container;
    }
}

那么我应该更喜欢转换方法,类型转换还是两者兼而有之?

一开始我会考虑性能、最佳用法和个人习惯。

4

1 回答 1

3

我想我会按照这些思路做一些事情:

  • 创建一个代表您的配置的类型:IConfig
  • 创建一个代表你的配置加载器的类型IConfigLoader
  • 创建返回实例的不同配置加载器实现(XmlConfigLoaderTextConfigLoader等) 。IConfig
  • 选择加载器实现以动态使用、配置或硬编码等。例如,您可以使用抽象工厂或 IoC 容器。
  • 将加载的IConfig实例传递给ContainerClass构造函数,并让它自己初始化。

关于您的问题,我不确定将配置对象传递给容器会破坏 SRP。至少,您可以为您的容器建立一个工厂,该工厂将获取并读取配置以实例化和初始化容器。它可能是过度设计的——我猜这取决于容器创建任务的复杂程度。

于 2009-05-07T13:01:50.400 回答