文字列をとる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
この回答は機能しますが、私は別のルートに進むことにしましたが、おそらく新しい質問を作成することになります。 –