簡體   English   中英

當我只有類型名稱中的字符串時,如何使用structuremap解析類型

[英]Using structuremap how do I resolve a type when I only have a string from the type name

我需要使用插件模型,在該模型中,我需要允許由Structuremap創建ITask的類型,但在運行時只有類型名稱的字符串。 這些類型需要使用Ctor注入進行組合,因此我無法建立現有的類型。

另外,我不想獲取所有類型,然后查詢類型名稱,因為它們的構造成本可能很高。

我缺少任何內置功能嗎?

您可以使用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();
   }
}

我沒有嘗試過,但是也許您可以使用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]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM