TypedFactory 的参数不会被进一步绕过
Parameters of the TypedFactory are not bypassed further
有类型工厂:
public interface IDataProviderFactory
{
IDataProvider Create(ConfigurationItem configurationItem);
void Release(IDataProvider dataProvider);
}
IDataProvider有几种实现方式
- 一些实现依赖于 ICalculator
- ICalculator 有多种实现方式
有个配置class:
public class ConfigurationItem
{
public CalculatorsEnum CalculatorsEnum { get; set; }
public DataPriversEnum DataPriversEnum { get; set; }
}
当我尝试调用工厂方法 Create 时,Windsor 正在尝试解析 IDataProvider 的依赖项,即 ICalculator。
这里我需要容器使用原始参数中的信息,以便了解使用哪个版本的 ICalculator。
更新
我想补充一些细节:
- 有一个 class 我使用 IDataProviderFactory 的地方。我在那里控制 IDataProvider 的生命周期,我不时使用工厂创建和销毁它们。所以在这个级别上,我不想了解有关 IDataProvider 实现的任何信息 - 可能有没有计算器的 DataProvider。
- 一开始我有自己的 IDataProviderFactory 实现,我可以在其中解析 ICalculator 并将其注入 DataProvider。但是说到回收的时候,我是对DataProvider进行了disposing,但是好像disposing是不够的,万一windsor手动解决的时候,需要显式release。
可能的解决方案:
- 我仍然可以手动完成所有这些,但很可能我会通过一些转换来破坏美感。
- 如果需要,我可以将计算器的类型化工厂注入到 DataProviders 实现中,并在那里控制计算器的生命周期。例如:我用我的工厂创建了 DataProvider,然后我不需要它,我释放了它,容器将调用 DataProvider 的处理,我将用它自己的工厂释放计算器。
- 温莎之路?
构造函数参数仅传递给正在解析的顶级服务的构造函数。这是设计使然。
推荐的解决方案是创建一个同时解析 ICalculator 和 IDataProvider 的工厂。解析时,您将显式解析 ICalculator,然后将其传递给 IDataProvider 的工厂函数。
有关进一步讨论,请参阅 this question。
更新
是的,每个 Resolve 都应该有一个匹配的 Release,无论是使用工厂还是直接使用容器都是如此。
建议 "the Windsor way" 解决您的特定情况可能只是推测。
Windsor 提供了多种指定内联依赖项的不同方法。有关详细信息,请参阅 here。通常概述的方法比使用工厂等更可取,因为 resolving/releasing 由容器管理。
有类型工厂:
public interface IDataProviderFactory { IDataProvider Create(ConfigurationItem configurationItem); void Release(IDataProvider dataProvider); }
IDataProvider有几种实现方式
- 一些实现依赖于 ICalculator
- ICalculator 有多种实现方式
有个配置class:
public class ConfigurationItem { public CalculatorsEnum CalculatorsEnum { get; set; } public DataPriversEnum DataPriversEnum { get; set; } }
当我尝试调用工厂方法 Create 时,Windsor 正在尝试解析 IDataProvider 的依赖项,即 ICalculator。
这里我需要容器使用原始参数中的信息,以便了解使用哪个版本的 ICalculator。
更新
我想补充一些细节:
- 有一个 class 我使用 IDataProviderFactory 的地方。我在那里控制 IDataProvider 的生命周期,我不时使用工厂创建和销毁它们。所以在这个级别上,我不想了解有关 IDataProvider 实现的任何信息 - 可能有没有计算器的 DataProvider。
- 一开始我有自己的 IDataProviderFactory 实现,我可以在其中解析 ICalculator 并将其注入 DataProvider。但是说到回收的时候,我是对DataProvider进行了disposing,但是好像disposing是不够的,万一windsor手动解决的时候,需要显式release。
可能的解决方案:
- 我仍然可以手动完成所有这些,但很可能我会通过一些转换来破坏美感。
- 如果需要,我可以将计算器的类型化工厂注入到 DataProviders 实现中,并在那里控制计算器的生命周期。例如:我用我的工厂创建了 DataProvider,然后我不需要它,我释放了它,容器将调用 DataProvider 的处理,我将用它自己的工厂释放计算器。
- 温莎之路?
构造函数参数仅传递给正在解析的顶级服务的构造函数。这是设计使然。
推荐的解决方案是创建一个同时解析 ICalculator 和 IDataProvider 的工厂。解析时,您将显式解析 ICalculator,然后将其传递给 IDataProvider 的工厂函数。
有关进一步讨论,请参阅 this question。
更新
是的,每个 Resolve 都应该有一个匹配的 Release,无论是使用工厂还是直接使用容器都是如此。
建议 "the Windsor way" 解决您的特定情况可能只是推测。
Windsor 提供了多种指定内联依赖项的不同方法。有关详细信息,请参阅 here。通常概述的方法比使用工厂等更可取,因为 resolving/releasing 由容器管理。