Как написать собственный активатор виндзор, который создает объекты по строке? - PullRequest
1 голос
/ 21 ноября 2010

У меня есть консольное приложение, которое получает имя класса и вызывает его функцию:

Assembly asm = Assembly.GetEntryAssembly();
ObjectHandle oh = Activator.CreateInstance(asm.FullName, typeName);

IScheduledTask task = (IScheduledTask)oh.Unwrap();
task.Execute();

До сих пор не было необходимости в инициализации, кроме этого, но теперь у нас есть некоторые компоненты, которые IScheduledTaskбудет выполняться через внедрение конструктора.
Есть ли способ определения именованного экземпляра с тем же именем класса, который позднее разрешит все зависимости с помощью resol?
То есть, если я получу "SomeScheduledTask" какпараметр, который я могу сделать так:

IScheduledTask task = (IScheduledTask)container.Resolve(typeName); // I know this is possible. The problem is the registration.

Могу ли я сделать что-то подобное для решения моей проблемы:

container.Register(Component.For<IScheduledTask>().Named(t => t.Name).Activator<MyActivator>())

И в моем активаторе сделать что-то вроде этого:*

1 Ответ

2 голосов
/ 22 ноября 2010

Если я правильно понимаю, проблема в том, что вы не знаете заранее, какой тип реализации для IScheduledTask будет использоваться, поэтому вы не можете зарегистрировать его как обычно. В этом случае IComponentActivator не является подходящей точкой расширения для использования. Попробуйте взамен ILazyComponentLoader .

Если вы действительно знаете, какие возможные реализации IScheduledTask может использовать программа, сканируйте и регистрируйте их как обычно .

...