Skip to main content
 首页 » 编程设计

c#之如何在 StructureMap 中动态创建对象的实例

2024年01月31日32over140

我有一个名为“ImportRunner”的抽象类。

我有一个名为“ScorecardRunner”的类的实现。

当我从 XML 文件中将对象类型作为字符串拉回并且它可以是 ImportRunner 的任何实现时,我如何在运行时获取 ScorecardRunner 等类的实例?

我目前的代码如下。

var importer = container.GetInstance<ImportRunner>(); 

当我尝试执行如下所示的操作时,出现编译错误。

var importer = container.GetInstance<Type.GetType("Importer.ScorecardRunner")>(); 

Operator '<' cannot be applied to operands of type 'method group' and 'Type'

谢谢,汤姆

请您参考如下方法:

与其分散基于运行时值创建实例的逻辑并将其硬塞到 StructureMap 的注册表中,更好的方法是简单地创建一个工厂,负责确定正确的运行器实例并将其注入(inject)。

例如:

public class XmlReader 
{ 
    public bool IsScoreCard { get; set; } 
} 
 
public abstract class ImportRunner 
{ 
} 
 
public class ScorecardRunner : ImportRunner 
{ 
} 
 
public class DefaultRunner : ImportRunner 
{ 
} 
 
public class RunnerFactory 
{ 
    private readonly XmlReader _reader; 
 
    public RunnerFactory(XmlReader reader) 
    { 
        _reader = reader; 
    } 
 
    public ImportRunner Resolve() 
    { 
        if (_reader.IsScoreCard) 
            return new ScorecardRunner(); 
 
        return new DefaultRunner(); 
    } 
} 

然后在注册表中像这样配置它:

this.For<ImportRunner>().Use(ctx => ctx.GetInstance<RunnerFactory>().Resolve());