2016-09-18 65 views
1

我正在使用Castle Windsor 3.3并且需要注入一个需要IMachine实例的ViewModel。这些数据直到运行时才可用,所以我试图使用Typed Factory。如何将依赖关系传递给Castle Windsor类型的工厂

public MachDataViewModel(IMachine mach) 
{ 
     _mach = machCfg; 
} 

public interface IEquipmentDataFactory 
{ 
    IEquipmentData Create(IMachine mach); 
    void Release(IMachine mach); 
} 

这里是我的注册代码:

container.AddFacility<TypedFactoryFacility>(); 
container.Register(
    Component.For<IWindsorContainer>().Instance(container), 
    Component.For<IEquipmentData>().ImplementedBy<EquipmentData>(), 
    Component.For<IMachine>().ImplementedBy<Machine>(), 
    Component.For<IEquipmentDataFactory>().AsFactory()); 

当我调用Create方法,它注入一个新实例化的对象,而不是一个我通过。如果我在注册中删除Component.For<IMachine>条目,它会给我一个缺失的依赖关系。

IEquipmentData ed = null; 
IMachine m = GetMachine(); 
ed = factory.Create(m); 

如何让Windsor使用我传递给工厂的对象?

感谢

回答

0

的问题是,使用TypedFactoryFacility城堡知道如何解决你的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. 选项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. 选项2 - 与TypedFactoryFacility。在这种情况下,您将不得不实施ITypedFactoryComponentSelector来协助Castle并解释您通过的IMachine解决IEquipmentData的论点。

    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

enter image description here

+0

@cajundave - 这篇帮助您解决这个问题? –

相关问题