Dependency injection Castle Windsor使用参数解析对象 公共类组件1 { 公共组件1(组件2组件,组件3组件3) { 组件2=组件; 组件3=组件3; } 公共组件3组件3{get;set;} 公共组件2组件2{get;set;} } 公共类组件3 { 公共组件3(组件2组件) { 组件2=组件; } 公共组件2组件2{get;set;} } 公共类组件2 { 私有Guid_Guid=Guid.NewGuid(); } [测试方法] 公共无效InjectingSingDictionary() { var container=新的WindsorContainer(); container.Register(Component.For().ImplementedBy().LifestyleTransient()); container.Register(Component.For().ImplementedBy().LifestyleTransient()); container.Register(Component.For().ImplementedBy().LifestyleTransient()); 成分1c; var component2=新组件2(); 使用(container.BeginScope()) { IDictionary arguments=新字典{{“comp”,component2},{“component2”,component2}; c=container.Resolve(参数); c、 Component2.Should().Be(c.Component3.Component2); } }

Dependency injection Castle Windsor使用参数解析对象 公共类组件1 { 公共组件1(组件2组件,组件3组件3) { 组件2=组件; 组件3=组件3; } 公共组件3组件3{get;set;} 公共组件2组件2{get;set;} } 公共类组件3 { 公共组件3(组件2组件) { 组件2=组件; } 公共组件2组件2{get;set;} } 公共类组件2 { 私有Guid_Guid=Guid.NewGuid(); } [测试方法] 公共无效InjectingSingDictionary() { var container=新的WindsorContainer(); container.Register(Component.For().ImplementedBy().LifestyleTransient()); container.Register(Component.For().ImplementedBy().LifestyleTransient()); container.Register(Component.For().ImplementedBy().LifestyleTransient()); 成分1c; var component2=新组件2(); 使用(container.BeginScope()) { IDictionary arguments=新字典{{“comp”,component2},{“component2”,component2}; c=container.Resolve(参数); c、 Component2.Should().Be(c.Component3.Component2); } },dependency-injection,castle-windsor,Dependency Injection,Castle Windsor,大家好! 当我解析时,我希望传递Component2的一个实例来初始化所有道具,Windsor将其传递给整个对象图中的所有构造函数参数。可能吗?默认情况下不可能。默认情况下,此行为被禁用,因为它意味着根组件的使用必须对其整个图形有深入的了解,并且会导致出现问题。我应该如何做下一个任务:我有一个IService,它有DoJob()。此iSeries设备使用其他一些服务。所有服务都使用ILog记录其工作。我的客户打电话给IService.DoJob,他们需要日志。所以我想创建ILog实例,然后创建I

大家好!
当我解析时,我希望传递Component2的一个实例来初始化所有道具,Windsor将其传递给整个对象图中的所有构造函数参数。可能吗?

默认情况下不可能。默认情况下,此行为被禁用,因为它意味着根组件的使用必须对其整个图形有深入的了解,并且会导致出现问题。我应该如何做下一个任务:我有一个IService,它有DoJob()。此iSeries设备使用其他一些服务。所有服务都使用ILog记录其工作。我的客户打电话给IService.DoJob,他们需要日志。所以我想创建ILog实例,然后创建IService实例,它只记录一次DoJob调用的所有事件。我有一个解决方案:1)使组件2的生活方式范围。2) 在容器中为其注册工厂方法。3) 使用(container.BeginScope()){var service=container.Resolve();service.DoJob();var log=service.log;//使用日志结果}
public class Component1
{
    public Component1(Component2 comp, Component3 comp3)
    {
        Component2 = comp;
        Component3 = comp3;
    }

    public Component3 Component3 { get; set; }

    public Component2 Component2 { get; set; }
}

public class Component3
{
    public Component3(Component2 comp)
    {
        Component2 = comp;
    }

    public Component2 Component2 { get; set; }
}

public class Component2
{
    private Guid _guid = Guid.NewGuid();
}

[TestMethod]
    public void InjectingUsingDictionary()
    {
        var container = new WindsorContainer();
        container.Register(Component.For<Component1>().ImplementedBy<Component1>().LifestyleTransient());
        container.Register(Component.For<Component2>().ImplementedBy<Component2>().LifestyleTransient());
        container.Register(Component.For<Component3>().ImplementedBy<Component3>().LifestyleTransient());
        Component1 c;
        var component2 = new Component2();
        using (container.BeginScope())
        {
            IDictionary arguments = new Dictionary<string, object> { { "comp", component2 }, { "Component2", component2 } };
            c = container.Resolve<Component1>(arguments);
            c.Component2.Should().Be(c.Component3.Component2);
        }
    }