Проблема заключается в том, что использование TypedFactoryFacility
Castle знает, как разрешить для вас 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
)