2016-09-18 6 views
1

私はCastle Windsor 3.3を使用しており、IMachineインスタンスを注入するViewModelを持っています。このデータは実行時まで利用できないため、Typed Factoryを使用しようとしています。私はCreateメソッドを呼び出すと城ウィンザー型ファクトリに依存関係を渡す方法

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

は、それが新たにインスタンス化されたオブジェクトではなく、私が通過1を注入:

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

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

は、ここに私の登録コードです。私の登録でComponent.For<IMachine>のエントリを削除すると、それは私に欠けている依存関係を与えます。

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

ウィンザーに私が工場に渡すオブジェクトを使用させる方法を教えてください。

おかげ

答えて

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と。この場合、Castleを支援するために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); 
    

結果:

enter image description here

+0

@cajundave(マシンがコンテナに渡された/工場はIEquipmentDataの1である) - DIDこのヘルプあなたは質問を解決する? –

関連する問題