我目前正在开发一个项目,我需要在运行时根据配置文件创建对象。
项目示例
以下是我正在进行的项目的简化示例。
创建的每个对象都必须实现一个特定的接口,为了示例目的,将其称为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>
我认为我应该能够管理对象实例化部分,但我真的不知道如何用干净的代码管理实例的初始化。
答案 0 :(得分:1)
您应该能够使用assemblyInstance.GetType(string)
来解析类型(您可能需要使用命名空间作为前缀) - 之后您有两个选择:
1使用Activator.CreateInstance(resolvedType)
来实例化和反映属性 - 可能是硬编码一些PropertyType
方法来解析string
,int
等
但听起来像工作
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的概述。这样做可以更容易地阅读案例研究。