Создание обычной фабрики как windsor typed factory

#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())