2010-10-30 41 views
0

我有一個需要使用插件的模型,我需要允許通過structuremap創建類型的ITask,但我只有一個運行時類型名稱的字符串。這些類型需要使用Ctor注入來組成,因此我無法建立現有類型。使用結構圖如何解決一個類型,當我只有類型名稱的字符串

此外,我不想獲取所有類型,然後查詢類型名稱,因爲它們可能是昂貴的構造。

是否有任何內置的功能我缺少?

+0

我加另一種選擇,你可能想要檢查 – JeremyWeir 2010-10-30 07:14:35

回答

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]); 
} 
+0

我最終做了類似的事情,我查詢了Model屬性並使用鏈接從那裏獲取我的任務,然後使用Get創建具體的實現 – 2010-10-30 12:58:42

0

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

建議的方法是隱藏這個工廠類的背後:

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(); 
    } 
} 
相關問題