Проблема заключается в том, что использование TypedFactoryFacilityCastle знает, как разрешить для вас IEquipmentData(потенциально), но когда он пытался разрешить свои зависимости, он терпит неудачу, потому что они не зарегистрированы, и нет другого, кто SubResolverзнает, как разрешить IMachine.
Используя следующие классы: (Те, кто в вопросе не компилируются)
public class IMachine
{
public Guid Id { get; set; } = Guid.NewGuid();
}
public interface IEquipmentData { IMachine Machine { get; set; } }
public class MachineDataViewModel : IEquipmentData
{
public IMachine Machine { get; set; }
public MachineDataViewModel(IMachine machine) { Machine = machine; }
}
-
Вариант 1 - без
TypedFactory:WindsorContainer container = new WindsorContainer(); container.Register( Component.For<IEquipmentData>() .ImplementedBy<MachineDataViewModel>() .LifestyleTransient()); var machine = new IMachine(); var resultWithoutFactory = container.Resolve<IEquipmentData>(new Dictionary<string, object> { ["machine"] = machine }); -
Вариант 2 - с
TypedFactoryFacility. В этом случае вам нужно будет выполнитьITypedFactoryComponentSelectorпомощь, чтобы помочь Замку, и объяснить, что аргументы для разрешенияIEquipmentDataесть с тем,IMachineчто вы проходите.public interface IMachineFactory { IEquipmentData Create(IMachine machine); } public class EquipmentDataComponentSelector : ITypedFactoryComponentSelector { public Func<IKernelInternal, IReleasePolicy, object> SelectComponent(MethodInfo method, Type type, object[] arguments) { return (k, s) => k.Resolve<IEquipmentData>(new Dictionary<string, object> { ["machine"] = arguments[0] }); } }Главный:
WindsorContainer container = new WindsorContainer(); container.AddFacility<TypedFactoryFacility>(); container.Register( Component.For<IEquipmentData>() .ImplementedBy<MachineDataViewModel>() .LifestyleTransient(), Component.For<EquipmentDataComponentSelector>(), Component.For<IMachineFactory>() .AsFactory(f => f.SelectedWith<EquipmentDataComponentSelector>())); var machine = new IMachine(); var factory = container.Resolve<IMachineFactory>(); var resultWithFactory = factory.Create(machine);
Результат: (машина, переданная в контейнер / завод, является одной из них IEquipmentData)
