如何使用配置文件在运行时生成和初始化对象?

时间:2010-11-17 12:46:09

标签: c# configuration

我目前正在开发一个项目,我需要在运行时根据配置文件创建对象。

项目示例

以下是我正在进行的项目的简化示例。

创建的每个对象都必须实现一个特定的接口,为了示例目的,将其称为IObjectInterface

public interface IObjectInterface
{
    void DoSomething();
}

假设我有几个实现此接口的类,每个类都有一个特定的实现,以及与特定类型相关的多个其他属性:

public class SimpleObject : IObjectInterface
{
    public void DoSomething()
    {
        Console.WriteLine("SimpleObject did something");
    }
}

public class ComplexObject : IObjectInterface
{
    public string ObjectName { get; set; }

    public void DoSomething()
    {
        Console.WriteLine("The ComplexObject named {0} did something", this.ObjectName);
    }
}

public class VeryComplexObject : IObjectInterface
{
    public string ObjectName { get; set; }
    public bool CanDoSomething { get; set; }

    public void DoSomething()
    {
        if (this.CanDoSomething)
        {
            Console.WriteLine("The ComplexObject named {0} did something", this.ObjectName);
        }
        else
        {
            Console.WriteLine("The ComplexObject named {0} tried to do something, but was not allowed to", this.ObjectName);
        }
    }
}

我需要能够使用ObjectBuilder类创建与特定Id对应的IObjectInterface对象:

public class ObjectBuilder
{
    IObjectInterface BuildObject(string objectId)
    {
        // Build object here based on provided Id
    }
}

我正在寻找的是一种在配置文件中指定应创建的IObjectInterface的正确实现以及与特定类型相关联的参数值的方法。 理想的配置文件应如下所示:

<objects>
 <object id="Simple">
  <objectInterface type="SimpleObject" />
 </object>
 <object id="Complex">
  <objectInterface type="ComplexObject">
   <ObjectName value="MyObject" />
  </objectInterface>
 </object>
</objects>

我认为我应该能够管理对象实例化部分,但我真的不知道如何用干净的代码管理实例的初始化。

  • 关于如何实现这样的配置文件,您是否有一些线索?
  • 如何轻松创建所需对象的最终实例并使用配置文件中提供的参数对其进行初始化?
  • 是否有任何框架可以帮助我实现问题的解决方案?

4 个答案:

答案 0 :(得分:1)

您应该能够使用assemblyInstance.GetType(string)来解析类型(您可能需要使用命名空间作为前缀) - 之后您有两个选择:

1使用Activator.CreateInstance(resolvedType)来实例化和反映属性 - 可能是硬编码一些PropertyType方法来解析stringint

但听起来像工作

2更改配置文件的格式,使内部 xml块与XmlSerializer兼容 - 然后你可以抓住内部xml并通过

运行它
var ser = new XmlSerializer(resolvedType);
var obj = (IObjectInterface) ser.Deserialize(...);

(如果您已经有ReadSubTree,则使用子树(XmlReader)阅读器;如果您将xml作为字符串,则使用XmlReader.Create(new StringReader(xml))

例如xml(想到XmlSerializer)可能:

 <object id="Complex" type="ComplexObject">
  <ComplexObject>
    <ObjectName>MyObject</ObjectName>
  </ComplexObject>
 </object>

答案 1 :(得分:1)

听起来像IOC对我来说。 StructureMap NInject Microsoft Extensibility Framework

答案 2 :(得分:0)

您可能希望使用反射来创建配置中提供的类型的实例。

答案 3 :(得分:0)

我在Java中做了类似的事情,并且我写了一个关于我采用的基于反射的方法的详细解释。我不知道C#,但显然它与Java类似,所以我的以Java为中心的解释可能对你有用。

您可以在Config4*随附的“Config4 *实用使用指南”手册的第III部分(“Config4JMS案例研究”)中找到解释。但是,在阅读之前,我建议您阅读“Config4 *入门指南”的第2章和第3章,以获得配置文件语法和编程API的概述。这样做可以更容易地阅读案例研究。

相关问题