gpt4 book ai didi

.net - 城堡温莎国际奥委会 : Passing constructor parameters to child components

转载 作者:行者123 更新时间:2023-12-04 14:35:22 25 4
gpt4 key购买 nike

以下代码仅用于演示目的。

假设我有 2 个组件(businessService 和 dataService)和一个 UI 类。

UI类需要一个业务服务,businessService需要一个dataService,dataService依赖一个connectionString。

形成我需要解析业务服务的 UI 类,所以我正在编写以下代码:

var service = container.Resolve<BusinessService>(new { dependancy = "con string 123" }));

请注意,dependancy 是 connectionString 构造函数参数。

但是上面的代码不起作用,说dataService期望的依赖没有得到满足。

Can't create component 'dataService' as it has dependencies to be satisfied. dataService is waiting for the following dependencies:

Keys (components with specific keys) - dependancy which was not registered.



因此,作为一种解决方法,我正在这样做:
var service = container.Resolve<BusinessService>(new { dataService = container.Resolve<IDataService>(new { dependancy = "123" }) });

但是从设计、编码风格和许多角度来看,这不是一个好方法。

因此,如果您能建议为什么它不能以简单的方式工作,或者您有更好的解决方法,请分享。

最佳答案

您看到的行为是设计使然。

有几种方法可以解决这个问题,具体取决于您要传递的值的动态程度。

The documentation做的很详细,所以我不会在这里重申。

更新

为了清楚起见 - Windsor 不会在解析管道中传递内联参数。原因很简单——这样做会破坏抽象。调用代码必须隐含地知道您的 BusinessService取决于 DataService这取决于连接字符串。

如果您绝对必须这样做,请务必明确说明。这就是你正在做的事情 - 解决 DataService显式依赖于连接字符串,并显式解析 BusinessService路过 DataService作为依赖。

为了使事情真正明确(并且更好用),我建议使用 Typed Factory 而不是直接调用容器

public interface IFactory
{
IDataService ResolveDataService(string connectionString);
IBussinessService ResolveBussinessService(IDataService dataService);
// possibly release method for IBussinessService as well
}

关于.net - 城堡温莎国际奥委会 : Passing constructor parameters to child components,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3904951/

25 4 0