Как получить экземпляр универсального объекта, используя StructureMap в 2 разных случаях? - PullRequest
4 голосов
/ 14 июня 2011

У меня следующий интерфейс

 public interface IBuilder<T>
 {
    T Create(string param);
 }

со многими классами, которые реализуют интерфейс выше.Один из них:

 public class ConcreteABuilder : IBuilder<ConcreteA>
 {
        public ConcreteA Create(string param)
        {
            return new ConcreteA();
        }
 }

Я использую StructureMap для регистрации всех классов, которые реализуют IBuilder<>

Scan(x =>
{
      x.TheCallingAssembly();
      x.AddAllTypesOf(typeof(IBuilder<>));
});    

Теперь у меня 2 случая

РЕДАКТИРОВАНИЕ

Я получаю типы (в обоих случаях) в виде System.Type

Дело 1

Во время выполнения я получаю любой T тип ( System.Type ) (например, typeof (ConcreteA) ), и мне нужно получить соответствующий экземпляр компоновщика,В этом случае он должен вернуть ConcreteABuilder экземпляр.

Случай 2

Во время выполнения я получаю тип ( System.Type ) некоторых реализованных IBuilder (например, typeof (ConcreteABuilder) ), и мне нужно получить соответствующий экземпляр компоновщика.В этом случае он должен вернуть ConcreteABuilder экземпляр.

Как использовать ObjectFactory StructureMap для решения Case1 & Case2?

Спасибо

Ответы [ 2 ]

2 голосов
/ 09 июля 2011

Используйте это в конфигурации StructureMap

x.ConnectImplementationsToTypesClosing(typeof(IBuilder<>))

сейчас, чтобы разрешить универсальный тип во время выполнения

Type openType = typeof(IBuilder<>);//generic open type
var type = openType.MakeGenericType(modelType);//modelType is your runtime type

var builder = StructureMap.ObjectFactory.Container.GetInstance(type);//should get your ConcreteABuilder 
1 голос
/ 14 июня 2011

Я думаю, что вы ищете, чтобы зарегистрировать ваши типы с:

x.ConnectImplementationsToTypesClosing(typeof(IBuilder<>))

Тогда запрос контейнера IBuilder<ConcreteA> или ConcreteABuilder вернет ConcreteABuilder ... теперь проблема в том, что, поскольку вы не знаете тип до времени выполнения (выбранный пользователем или чем-то?) , вы можете использовать только неуниверсальную версию:

object someBuilder = ObjectFactory.GetInstance(thePassedInTypeAtRuntime);
... then use reflection to invoke the createMethod

или

dynamic someBuilder = (dynamic)ObjectFactory.GetInstance(thePassedInTypeAtRuntime);
....

и где-то, где вы действительно знаете, что вы запрашиваете IBuilder, который может вернуть ConcreteA

ConcreteA myA = someBuilder.Create(someParams);
...