#c# #inversion-of-control #castle-windsor
#c# #инверсия управления #castle-виндзор
Вопрос:
У меня есть my Factory
, который следует вызывать все время, когда я хочу IValidationProgram
public static class Factory{
public static IValidationProgram CreateProgramA(){
var program = new ValidationProgram(
new DependencyA(
new SubDependencyA(),
new SubDependencyB(),
),
new DependencyB()
);
}
}
Я хотел зарегистрироваться таким образом:
Container.Register(Component.For<IValidationProgram>().Instance(Factory.CreateProgramA()).LifeStyleTransient());
Но я не получаю новый экземпляр все время, когда IValidationProgram
выполняется разрешение. Я читал, что мне нужна типизированная фабрика, но я безуспешно пытался в течение 2 дней для моего случая. Все эти зависимости и подчиненные зависимости имеют интерфейс. Но я думаю, что они мне для этого не нужны. Если они могут помочь, давайте назовем их IDependency
и ISubDependency
.
Ответ №1:
Вы не получите новый экземпляр, потому что вы предоставляете во время регистрации уже созданный экземпляр вместо того, чтобы позволить контейнеру создать его (рекомендуемое поведение …). IOW: поскольку вы используете «Instance» во время регистрации, указанный стиль жизни будет просто проигнорирован.
Обычная регистрация должна быть:
Component.For<IValidationProgram>().ImplementedBy<yourValidationProgram>.LifeStyleTransient()
если вам действительно нужна фабрика для вашего компонента, вы можете использовать TypedFactory или встроенную регистрацию с использованием FactoryMethod
container
.Register(
Component.For<IValidationProgramFactory>().ImplementedBy<YourValidationProgramFactory>(),
Component.For<IValidationProgram>()
.UsingFactoryMethod(kernel => kernel.Resolve<IValidationProgramFactory>().Create())
);
В этом случае вы можете использовать свой подход к экземпляру, но только для фабрики!
Component.For<IValidationProgramFactory>().Instance(new Factory())