2017-01-11 16 views
1

文字列をとるCastleのTypedFactoryFacilityを使用するファクトリに使用するインターフェイスがあります。CastleがTypedFactoryでサブ依存関係を解決しない

public interface IFoo<T> {} 
public interface IBar1 : IFoo<IBar1> {} 
public interface IBar2 : IFoo<IBar2> {} 

public class MyClass1 : IBar1 {} 
public class MyClass2 : IBar2 {} 

public interface IFactory<T> where T : IFoo<T> 
{ 
    T Create(string primitive2); 
} 

どちらMyClassesを指しますが、サブ依存性を持っている:

public class SubDependency : ISubDependency 
{ 
    public SubDependency(string primitive1, string primitive2) 
} 

私はIFoo <に基づいて、指定された名前空間内のすべてのMyClassesを指しますをインストールしたい>私はインスタンスがIBARインタフェースによって要求され、解決したいです。したがって、両方のインタフェースを登録して、同じクラスの同じインスタンスに解決する必要があります。ここで

は私のインストーラコードです:

// register foo 
container.Register(
    Classes.FromAssemblyContaining(typeof(IFoo<>)) 
     .InSameNamespaceAs(typeof(IFoo<>)) 
     .WithServiceAllInterfaces() 
     .LifeStyleHybridPerWebRequestTransient()); 

// register factory 
container.Register(
    Component.For(typeof(IFactory<>)).AsFactory() 
     .LifeStyle.HybridPerWebRequestTransient()); 

// register sub dependency 
container.Register(
    Component.For<ISubDependency>().ImplementedBy<SubDependency>() 
     .LifeStyle.HybridPerWebRequestTransient() 
     .DependsOn(new 
     { 
      primitive1 = "this resolves" 
     })); 

は、その後、私はこのように私のコンテナを登録します。私は、コンテナを見てみると

var container = new WindsorContainer().Install(FromAssembly.This()); 
container.AddFacility<TypedFactoryFacility>(); 

var factory = container.Resolve<IFactory<IBar1>>(); 
var myClass1 = factory.Create("primitive2: this does not resolve"); 

それは私はかかわらず、すべてを(登録されていることを示しています正しく登録されているかどうかはわかりません)。

私は次のエラーを取得する:

Could not resolve non-optional dependency for 'SubDependency' (SubDependency). Parameter 'primitive2' type 'System.String'

私はコンテナが同じ名前の引数を持っていたすべてのサブ依存関係に工場からパラメータを渡すことになっていたと思いました。これを正しく解決するにはどうすればいいですか?インストーラで1つの値を定義し、実行時に別の値を指定できます。

UPDATE: 作品下記の私の答えは、私はいくつかのコンテナの警告を取得しますが、私が解決するかどうかはわかりません:それは恐ろしいハックのように思えるが、私はそれが動作するようになった

 
All components are potentially misconfigured (except for the IFactory): scope 
Components with potential duplicated dependencies: SubDependency, TypedFactoryComponentSelector 

答えて

0

を、そう何かガイダンスを得ることは素晴らしいことです。

私は私にIFoo <>登録を変更:これは動作しますが、私はそれを好きではないと私は良い方法があります願っています

container.Register(
    Classes.FromAssemblyContaining(typeof(IFoo<>)) 
     .InSameNamespaceAs(typeof(IFoo<>)) 
     .WithServiceAllInterfaces() 
     .LifeStyleHybridPerWebRequestTransient() 
     .Configure(r => r.DynamicParameters((k, d) => 
     { 
      var subDependency = k.Resolve<ISubDependency>(d); 
      d.Add("subDepedency", subDependency); 
     }))); 

public class MyClass1 : IBar1 
{ 
    public MyClass1(SubDependency subDependency) // <-- MUST be named that. 
} 

私はわからないんだけど、私は、このソリューションで解決より多くの問題を引き起こしてきた場合:これは、依存関係としてSubDependencyを持っているすべてのクラスは、例えば、「subDependencyを」という名前を付けていることが必要です。 TypedFactoryパラメータが、その名前の引数を持つすべてのサブ依存関係に伝播するようにする簡単な方法はありますか?

+0

この回答は機能しますが、私は別のルートに進むことにしましたが、おそらく新しい質問を作成することになります。 –

関連する問題