2014-01-28 7 views
0

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

Я понимаю, что я могу сделать что-то вроде:

public object Create(Type type) 
{ 
    return globalContainer.Resolve(type); 
} 

Но я хочу, чтобы иметь возможность сделать это без отсылая к контейнеру. Мне было интересно, можно ли это сделать, используя типичный завод? Что-то вроде

public interface IObjFactory 
{ 
    object Create(Type type); 
} 

public class Installer: IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.AddFacility<TypedFactoryFacility>(); 

     container.Register(Component.For<IObjFactory>().AsFactory()); 
    } 
} 

public class Something 
{ 
    private readonly IObjFactory objFactory; 

    public Something(IObjFactory objFactory) 
    { 
     this.objFactory = objFactory; 
    } 

    public void Execute(Type type) 
    { 
     var instance = objFactory.Create(type); 

     // do stuff with instance 
    } 
} 
+0

Почему бы не дать методу параметр типа и вернуть этот тип, а не объект? – Magus

+0

Magnus - я имею дело с сторонним API, и все, что они передают мне, - это System.Type для разрешения. –

+0

RochardNoogle - я думаю, что до тех пор, пока вы уже прошли контейнер для создания класса с помощью метода create, ваш первый пример в порядке. Это просто, и в будущем, если это необходимо, не представляется сложным заменить. – Magus

ответ

1

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

С уважением, Marwijn.

public interface IObjFactory 
{ 
    object Create(Type type); 
} 

public class FactoryCreatedComponent 
{ 

} 

public class Installer : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.AddFacility<TypedFactoryFacility>(); 
     container.Register(
      Component.For<FactoryCreatedComponent>(), 
      Component.For<IObjFactory>().AsFactory(new TypeBasedCompenentSelector())); 
    } 
} 

public class TypeBasedCompenentSelector : DefaultTypedFactoryComponentSelector 
{ 
    protected override Type GetComponentType(MethodInfo method, object[] arguments) 
    { 
     return (Type) arguments[0]; 
    } 
} 



class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new WindsorContainer(); 
     container.Install(new Installer()); 
     var factory = container.Resolve<IObjFactory>(); 

     var component = factory.Create(typeof (FactoryCreatedComponent)); 

     Debug.Assert(typeof(FactoryCreatedComponent) == component.GetType()); 
    } 
} 
Смежные вопросы