0
  1. 有一个类型化工厂:

    public interface IDataProviderFactory
    {
        IDataProvider Create(ConfigurationItem configurationItem);
        void Release(IDataProvider dataProvider);
    }
    
  2. IDataProvider 有几种实现

  3. 一些实现依赖于 ICalculator
  4. ICalculator 有几种实现
  5. 有一个配置类:

    public class ConfigurationItem
    {
         public CalculatorsEnum CalculatorsEnum { get; set; }
         public DataPriversEnum DataPriversEnum { get; set; }        
    }
    

当我尝试调用工厂的方法 Create 时,Windsor 正在尝试解析 IDataProvider 的依赖项,即 ICalculator。

在这里,我需要容器使用原始参数中的信息,以便了解要使用哪个版本的 ICalculator。

更新

我想补充一些细节:

  1. 有一个类我使用 IDataProviderFactory。在那里我控制 IDataProviders 的生命周期,我不时使用工厂创建和销毁它们。所以在这个级别上,我不想知道任何关于 IDataProvider 实现的信息——可能有没有计算器的 DataProvider。
  2. 一开始我有自己的 IDataProviderFactory 实现,我可以在其中解析 ICalculator 并将其注入 DataProvider。但是在回收方面,我正在处理 DataProvider,但是在 Windsor 的情况下,当您手动解决某些问题时,处理似乎是不够的,您需要显式释放它。

可能的解决方案:

  • 我仍然可以手动完成所有这些,但很可能我会通过一些演员来打破美感。
  • 如果需要,我可以将 Calculators 的类型化工厂注入 DataProviders 实现,并在那里控制 Calculator 的生命周期。例如:我用我的工厂创建了 DataProvider,然后我不需要它,我释放它,容器将调用 DataProvider 的 dispose,我将在其中释放带有自己工厂的计算器。
  • 温莎方式?
4

1 回答 1

1

构造函数参数仅传递给正在解析的顶级服务的构造函数。这是设计使然。

推荐的解决方案是创建一个同时解析 ICalculator 和 IDataProvider 的工厂。解析时,您将显式解析 ICalculator,然后将其传递给 IDataProvider 的工厂函数。

请参阅此问题以进行进一步讨论。

更新

是的,每个 Resolve 都应该有一个匹配的 Release,无论是直接使用工厂还是容器都是如此。

提出解决您的特定情况的“温莎方式”可能只是猜测。

Windsor 提供了许多不同的方法来指定内联依赖项。有关详细信息,请参见此处。通常,概述的方法比使用工厂等更可取,因为解析/释放是由容器管理的。

于 2015-03-27T03:05:45.623 回答