[英]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.