Castle.Windsor での作品がライフスタイルにどのように結びついているかを理解しようとしていますが、まだ理解できていないと思います :)
したがって、以下のテストでは、次の仮定をテストしています
。1) コンポーネントが何かにバインドされている場合、依存関係階層全体で何かの同じインスタンスを受け取る必要があります。
2) コンポーネントに複数の登録があり、最初の登録がバインドされている場合、バインドされたインスタンスの場合は 1) のように機能し、他のインスタンスの場合はバインドされていない登録で説明されているようにインスタンスを生成する必要があります。それはドキュメントには記載されていませんが、私も論理的に見えます。
3) 構文ではライフ スタイルを連鎖させることができるため、一般に、単一の名前でコンポーネントを複数のバインドされたコンポーネントに登録できるはずです。以下のテストではありませんが、それは初期バージョンであり、思ったように動作しませんでした。
4) (実際の質問)バインドされたコンポーネントが異なる同じコンポーネントに 2 つの登録がある場合、それらは異なるインスタンスを受け取る必要がありますか? この構成には 2 つの問題があります。
a) どういうわけか、Windsor はすべての依存関係を解決しません ( bound2.DataContext
null です)
b)私が正しくないと思うものとbound.DataContext
等しい(直感的)。bound2.Service.DataContext
[TestFixture]
public class IocTests
{
[Test]
public void BoundRegistrationsTest()
{
var container = new WindsorContainer();
container.Register(
Component.For<IDataContext>()
.ImplementedBy<DataContext>()
.LifestyleBoundTo<BoundContextUser()
.Named("IDataContext_BoundContextUser"),
Component.For<IDataContext>()
.ImplementedBy<DataContext>()
.LifestyleBoundTo<BoundContextUser2()
.Named("IDataContext_BoundContextUser2"),
Component.For<IDataContext>()
.ImplementedBy<DataContext>()
.LifestyleTransient(),
Component.For<BoundContextUser>()
.LifestyleTransient(),
Component.For<BoundContextUser2>()
.LifestyleTransient(),
Component.For<IService>()
.ImplementedBy<Service>()
.LifeStyleTransient(),
Component.For<UnboudContextUser>()
.LifestyleTransient()
);
var bound = container.Resolve<BoundContextUser>();
var bound2 = container.Resolve<BoundContextUser2>();
var unbound = container.Resolve<UnboudContextUser>();
Assert.AreEqual(bound.DataContext, bound.Service.DataContext);
Assert.AreNotEqual(unbound.DataContext, unbound.Service.DataContext);
// this fails
Assert.AreEqual(bound2.DataContext, bound2.Service.DataContext);
// if bound2.DataContext would not be null, this would fail too
Assert.AreNotEqual(bound.DataContext, bound2.DataContext);
}
}
public class BoundContextUser
{
public IDataContext DataContext { get; set; }
public IService Service { get; set; }
}
public class BoundContextUser2
{
public IDataContext DataContext { get; set; }
public IService Service { get; set; }
}
public interface IService
{
IDataContext DataContext { get; set; }
}
public class Service : IService
{
public IDataContext DataContext { get; set; }
}
public class UnboudContextUser
{
public IDataContext DataContext { get; set; }
public IService Service { get; set; }
}
public class DataContext : IDataContext
{
}
public interface IDataContext
{
}
更新: Marwijn が正しく気付いたように、lifestyle を Service に設定するのを忘れていたので、4 b) はもはや実際的ではありませんが、4 a) で述べたように、すべてのプロパティを解決するわけではありません。