【问题标题】:How do you pass an IOC target into another IOC target using Castle Windsor?如何使用 Castle Windsor 将 IOC 目标传递给另一个 IOC 目标?
【发布时间】:2013-06-19 04:12:27
【问题描述】:

我的问题可能很糟糕,但这是我在伪代码中使用 Castle Windsor 所做的尝试:

Register IFoo as Foo
Register IBar as Bar

When IFoo Is Passed Into a constructor And Being Resolved to Foo:
    Resolve IBar to Bar And pass typeof(Foo) to IBar.Create() method
        [ Resolve<IBar>().Create(typeof(Foo)) ]

目标是,每当我尝试使用 IFoo 作为依赖项时,我都想将 IFoo (Foo) 的 TYPE 的实现传递给 IBar 上的一个方法——这将做一些工作来新建一个 Foo 和给 Foo POCO 补水。

有什么想法吗?

【问题讨论】:

    标签: c# inversion-of-control castle-windsor


    【解决方案1】:

    不完全确定您想从这个示例中做什么?我唯一可以建议的是,这将是在具体类型中处理的东西(与温莎城堡无关)。所以:

    Public Class Foo
    {
        Public Foo(IBar bar)
        {
            bar.Create(typeof(Foo));
        }
    }
    

    编辑: 您似乎在说的是您希望 Foo 由 Bar 构造为factory。在这种情况下,工厂与其负责创建的类型之间的耦合是可以接受的。因此,您可以将工厂 IBar 传递给任何需要 IFoo 实例的类并直接调用 create 方法。然后,如果需要,您可以切换 IBar 的工厂实现映射,为您提供所需的任何具体 IFoo。

    【讨论】:

    • 谢谢,杰。您的“最终”编辑已结束。但是,无论传入什么类型,我都希望我的 IBar 工厂能够生产出混凝土。本质上,IBar 应该能够返回“Foo”或“Class2”或“Class3”。无论我给它作为 Create() 中的 Type 参数(我的 Create() 返回类型是 Type 对象)。考虑到这一点,工厂不会知道任何具体类型。它只是使用反射来创建我传入的任何类型的新实例。知道这一点 - 有什么新建议吗?
    • 好的。我现在想了解更多你的意思。所以,IBar 可以在它的构造函数中使用一个 IFoo,有一个返回 typeof 的属性,工厂被注入到任何需要 IFoo 的地方,并且调用 create 方法返回一个实例? msdn.microsoft.com/en-us/library/wccyzw83.aspx
    • 听起来非常正确。我的 Factory Create() 方法执行 var obj = Activator.CreateInstance(type); 并在进行一些额外工作后返回该 obj。但是,如果我做了 IBar 之类的操作,那么工厂中的 Type 不是 IFoo 吗?而不是福?还是会在此过程中得到解决?
    • GetType 将为您获取对象的运行时类型,这就是您所追求的。 msdn.microsoft.com/en-us/library/system.object.gettype.aspx
    • 是的,使用泛型方法会是一种更简洁的方法。这是一个漫长的前夜:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多