温莎城堡 - 我应该从其他班级引用容器吗?

时间:2012-04-26 14:47:12

标签: castle-windsor

我即将使用Windsor开始一个新项目,但我一直想知道运行到A类可能需要实例化B类的场景,但是Windsor注入一个实例是不可行的或不可能的B级进入它。我很难想到一个场景,但是这里有:

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

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

我可以将我的WindsorContainer公开为公共单例,可以通过任何需要它的代码访问,但这似乎令人不悦。还有其他建议吗?

1 个答案:

答案 0 :(得分:2)

  

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

没有。通过引用容器,您可以为您的类添加复杂且不必要的依赖,这将使测试复杂化并增加复杂性。

  

服务收到的Customer对象已被WCF反序列化,因此Windsor不参与其实例化,因此我无法注入任何依赖项。

我认为这是你应该去的方向,尝试探索是否真的没有办法控制反序列化,这样你就可以注入依赖项了。

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