我即将使用Windsor开始一个新项目,但我一直想知道运行到A类可能需要实例化B类的场景,但是Windsor注入一个实例是不可行的或不可能的B级进入它。我很难想到一个场景,但是这里有:
假设我有一个传递给WCF服务的业务实体“Customer”。此类具有Ent.Lib自我验证方法,该方法又使用帮助程序类“CustomerValidator”。服务收到的Customer对象已被WCF反序列化,因此Windsor不参与其实例化,因此我无法注入任何依赖项。我也不能将CustomerValidator传递给自我验证方法,因为它必须遵循Ent.Lib的特定签名。那么我怎么能在这个类/方法中实例化CustomerValidator呢?我仍然想利用温莎而不是简单地做一个“ var cv = new CustomerValidator(); ”。
这不是一个很好的例子,因为它可以用不同的方式解决,例如将Customer对象传递给验证方法而不是在Customer类中使用验证方法,但它提供了可供讨论的场景。
我可以将我的WindsorContainer公开为公共单例,可以通过任何需要它的代码访问,但这似乎令人不悦。还有其他建议吗?
答案 0 :(得分:2)
我应该从其他类引用容器吗?
没有。通过引用容器,您可以为您的类添加复杂且不必要的依赖,这将使测试复杂化并增加复杂性。
服务收到的Customer对象已被WCF反序列化,因此Windsor不参与其实例化,因此我无法注入任何依赖项。
我认为这是你应该去的方向,尝试探索是否真的没有办法控制反序列化,这样你就可以注入依赖项了。
如果失败,请考虑使用http://commonservicelocator.codeplex.com/。它的Microsoft服务位置实现与Windsor适配器可用。它基本上与您引用容器的模式相同,但是您没有引入对特定容器实现的依赖性。另外我认为模拟测试会更容易。