不再绕过TypedFactory的参数

时间:2015-03-26 16:08:18

标签: c# dependency-injection castle-windsor windsor-facilities

  1. 有一个打字的工厂:

    public interface IDataProviderFactory
    {
        IDataProvider Create(ConfigurationItem configurationItem);
        void Release(IDataProvider dataProvider);
    }
    
  2. IDataProvider

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

    public class ConfigurationItem
    {
         public CalculatorsEnum CalculatorsEnum { get; set; }
         public DataPriversEnum DataPriversEnum { get; set; }        
    }
    
  7. 当我试图调用工厂的方法Create时,Windsor正在尝试解析IDataProvider的依赖关系,即ICalculator。

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

    更新

    我想补充一些细节:

    1. 有一个我使用IDataProviderFactory的类。在那里我控制了IDataProviders的生命周期,我使用工厂不时创建和销毁它们。所以在这个级别我不想知道有关IDataProvider实现的任何信息 - 可能没有计算器的DataProvider。
    2. 一开始我有自己的IDataProviderFactory实现,在那里我可以解析ICalculator并将其注入DataProvider。但是当涉及到回收时,我正在处理DataProvider,但是当你手动解决某些问题时,如果使用Windsor进行处理是不够的,你需要明确释放它。
    3. 可能的解决方案:

      • 我仍然可以手动完成所有这些操作,但很可能我会用一些铸造来打破美丽。
      • 如果需要,我可以将计算器的类型工厂注入DataProviders实现,并控制计算器的生命周期。例如:我用我的工厂创建DataProvider然后我不需要它,我发布它,容器将调用DataProvider的dispose,我将在其中发布带有自己工厂的Calculator。
      • 温莎方式?

1 个答案:

答案 0 :(得分:1)

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

推荐的解决方案是建立一个解决ICalculator和IDataProvider的工厂。在解析时,您将明确解析ICalculator,然后将其传递给IDataProvider的工厂函数。

有关进一步的讨论,请参阅this question

<强>更新

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

只是猜测是什么&#34;温莎的方式&#34;解决您的特定情况可能是。

Windsor提供了许多指定内联依赖项的不同方法。有关详细信息,请参阅here。通常,所概述的方法优于使用工厂等,因为解析/释放由容器管理。