使用structuremap如何在我只有类型名称的字符串时解析类型

时间:2010-10-30 06:19:29

标签: c# .net structuremap

我需要使用插件模型,我需要允许结构图创建ITask类型,但我在运行时只有一个类型名称的字符串。这些类型需要使用Ctor注入组合,因此我无法构建现有类型。

此外,我不想获取所有类型,然后查询类型名称,因为构造它们可能很昂贵。

我缺少任何内置功能吗?

2 个答案:

答案 0 :(得分:0)

您可以使用ObjectFactory.GetNamedInstance<IPerson>("Customer");

建议的方法是将其隐藏在Factory类后面:

public interface IPersonFactory
{
    IPerson GetPersonInstance(string name);
}

public class StructureMapPersonFactory : IPersonFactory
{
    public IPerson GetPersonInstance(string name)
    {
        return ObjectFactory.GetNamedInstance<IPerson>(name);
    }
}

然后你可以这样做:

public class SomethingThatNeedsNamedInstance
{
   IPersonFactory _factory;
   IPerson _personInstance;

   public SomethingThatNeedsNamedInstance(IPersonFactory factory)
   {
      this._factory = factory; // regular DI greedy constructor, setup in registry.
   }

   public void DoSomething()
   {
       this._personInstance = _factory.GetPersonInstance("Customer");
       _personInstance.CallSomeMethod();
   }
}

答案 1 :(得分:0)

我没试过这个,但也许你可以使用Type.GetType,比如......

var task = (ITask)ObjectFactory.GetInstance(Type.GetType("Assembly.Qualified.Name.Of.Type"));

这假设您知道类型的程序集/命名空间。

请参阅http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx

另一种可能性......

在您的扫描仪中添加此

Scan(x =>
{
    x.AddAllTypesOf<ITask>();
}

然后,在一些解析器类......

private Dictionary<string, Type> typeLookup;
public ITask GetInstance(string typeName)
{
    if (typeLookup == null)
    {
        typeLookup = new Dictionary<string, Type>();
        var tasks = ObjectFactory.GetAllInstances<ITask>();
        foreach (var task in tasks)
        {
            typeLookup.Add(task.GetType().Name, task.GetType());
        }

    }
    return (ITask)ObjectFactory.GetInstance(typeLookup[typeName]);
}