我正在尝试了解 Castle.Windsor 中的工作方式如何影响生活方式,但我想我还不明白 :)
所以在下面的测试中,我正在测试以下假设:
1)如果组件绑定到某个东西,它应该在整个依赖层次结构中接收相同的某个实例,这是写在文档中的,并且是可以理解的并且看起来它可以工作。
2)如果组件有多个注册并且第一个注册是绑定的,对于绑定实例它应该像1)一样工作,对于其他实例它应该产生实例,如未绑定注册中所述。这在文档中没有提到,但我看起来也很合乎逻辑。
3) 语法允许链接生活方式,所以通常在单个名称下我应该能够使用多个绑定组件注册组件。它不在下面的测试中,但那是在初始版本中,并没有像我想象的那样工作。
4)(实际问题)如果同一组件具有不同绑定组件的两个注册,它们应该接收不同的实例吗?我看到这个配置有两个问题:
a) Windsor以某种方式无法解决所有依赖项(bound2.DataContext
为空)
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 正确注意到的那样,我忘记将生活方式设置为服务,因此 4 b) 不再是实际的,但它仍然不能解决所有属性,如 4 a) 中所述。