Используя Structuremap, как мне разрешить тип, когда у меня есть только строка из имени типа? - PullRequest
0 голосов
/ 30 октября 2010

У меня есть требование использовать подключаемую модель, где мне нужно разрешить создание типов ITask с помощью Structuremap, но у меня есть только строка имени типа во время выполнения. Эти типы должны использовать инъекцию Ctor для компоновки, поэтому я не могу создать существующий тип.

Кроме того, я не хочу получать все типы, а затем запрашивать имя типа, поскольку их создание может быть дорогостоящим.

Есть ли какая-то встроенная функциональность, которую мне не хватает?

Ответы [ 2 ]

0 голосов
/ 30 октября 2010

Я не пробовал этого, но, возможно, вы могли бы использовать 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 голосов
/ 30 октября 2010

Вы можете использовать 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();
   }
}
...