我有一個需要使用插件的模型,我需要允許通過structuremap創建類型的ITask,但我只有一個運行時類型名稱的字符串。這些類型需要使用Ctor注入來組成,因此我無法建立現有類型。使用結構圖如何解決一個類型,當我只有類型名稱的字符串
此外,我不想獲取所有類型,然後查詢類型名稱,因爲它們可能是昂貴的構造。
是否有任何內置的功能我缺少?
我有一個需要使用插件的模型,我需要允許通過structuremap創建類型的ITask,但我只有一個運行時類型名稱的字符串。這些類型需要使用Ctor注入來組成,因此我無法建立現有類型。使用結構圖如何解決一個類型,當我只有類型名稱的字符串
此外,我不想獲取所有類型,然後查詢類型名稱,因爲它們可能是昂貴的構造。
是否有任何內置的功能我缺少?
我沒有試過這個,但也許你可以使用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]);
}
我最終做了類似的事情,我查詢了Model屬性並使用鏈接從那裏獲取我的任務,然後使用Get創建具體的實現 – 2010-10-30 12:58:42
您可以使用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();
}
}
我加另一種選擇,你可能想要檢查 – JeremyWeir 2010-10-30 07:14:35