代码之家  ›  专栏  ›  技术社区  ›  Kev Hunter

使用structuremap当类型名中只有一个字符串时,如何解析类型

  •  0
  • Kev Hunter  · 技术社区  · 14 年前

    另外,我不想获取所有类型,然后查询类型名,因为它们的构造成本可能很高。

    2 回复  |  直到 14 年前
        1
  •  0
  •   JeremyWeir    14 年前

    我没试过,但也许你可以用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]);
    }
    
        2
  •  0
  •   RPM1984    14 年前

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