1

我即将开始一个使用 Windsor 的新项目,但我一直想知道是否会遇到 A 类可能需要实例化 B 类的场景,但 Windsor 将 B 类的实例注入到其中是不可行或不可能的它。我正在努力想一个场景,但这里有:

假设我有一个传递给 WCF 服务的业务实体“客户”。此类具有 Ent.Lib 自我验证方法,该方法又使用帮助器类“CustomerValidator”。服务接收到的 Customer 对象已经被 WCF 反序列化,所以 Windsor 不参与它的实例化,所以我不能注入任何依赖项。我也不能将我的 CustomerValidator 传递给自我验证方法,因为它必须遵循 Ent.Lib 的特定签名。那么如何在此类/方法中实例化 CustomerValidator 呢?我仍然想利用 Windsor 而不是简单地做一个“ var cv = new CustomerValidator(); ”。

这不是一个很好的示例,因为它可以通过不同的方式解决,例如将 Customer 对象传递给验证方法,而不是在 Customer 类中使用验证方法,但它提供了一个可能的讨论场景。

我可以将我的 WindsorContainer 公开为一个公共单例,任何需要它的代码都可以访问它,但这似乎是不受欢迎的。还有其他建议吗?

4

1 回答 1

2

我应该从其他类中引用容器吗?

不会。通过引用容器,您向您的类添加了复杂且不必要的依赖项,这将使测试复杂化并增加复杂性。

服务接收到的 Customer 对象已经被 WCF 反序列化,所以 Windsor 不参与它的实例化,所以我不能注入任何依赖项。

我认为这是您应该走的方向,尝试探索是否真的没有任何方法可以控制反序列化,以便您可以注入依赖项。

如果失败,请考虑使用http://commonservicelocator.codeplex.com/。其 Microsoft 的服务位置实施与 Windsor 适配器可用。它基本上与您引用容器的模式相同,但您不引入对特定容器实现的依赖。另外我认为模拟测试会更容易。

于 2012-04-26T21:00:42.713 回答