2016-09-18 77 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 - 這篇幫助您解決這個問題? –

相關問題