5

在阅读和搜索到筋疲力尽的地步后,我觉得我可能需要一些指导。

这可能部分是因为 Castle Windsor 3.0 的引入,但是大多数博客文章、SO 问题和其他文档都明确依赖于我所看到的现在已弃用的代码。

所以:问题?

在我的应用程序中,这是一个为 MVC3 应用程序提供后端代码的 WCF 服务,我有多个层,其中一个为文件上传系统提供病毒扫描服务。

客户要求支持多个扫描服务,我自然答应了,每个扫描服务都实现了一个 IScanService 接口,因此:

public interface IScanService
{
    void Execute();
    ScanResult GetResult();
}

因此,在 WCf 服务中,构造函数可能如下所示:

public McAfeeFileScanService(IScanService mcAfeeScanService)
    {
        _scanService = scanService;
    }

如何确定注入的 IScanService 是 McAfeeScanService 或 NortonScanService 或其他实现类型的实现?

默认情况下,AFAIK Windsor 将提供第一个注册的实现,无论它是否属于 McAfeeScanService 类型。

我正在研究 ServiceOverrides,但似乎在 Windsor 3.0 中已弃用,取而代之的是 DependsOn(Dependency.OnComponenent()) [但我没有找到任何相关示例] 我还研究了类型化工厂设施和 IHandlerSelector ,但觉得这个(看似常见且可能很简单)任务需要一些指导。

谢谢大家。

4

3 回答 3

7

在 Windsor 3 中不推荐使用 ServiceOverride。您必须像这样使用 Dependency.OnComponent:

Component.For<ISerializer>().ImplementedBy<JsonSerializer>().Named("jsonSerializer"),
Component.For<WebConnectionAcceptor, IChannelManager>().ImplementedBy<WebConnectionAcceptor>().Named("webAcceptor"),
Component.For<ConnectionAcceptorProxy>().Named("webProxy").DependsOn(
         Dependency.OnComponent("connectionAcceptor", "webAcceptor"), 
         Dependency.OnComponent("serializer", "jsonSerializer"))

OnComponent 中的第一个参数是绑定名称,第二个是组件名称。

于 2012-05-23T12:39:45.183 回答
2

在http://docs.castleproject.org/Default.aspx?Page=Inline-Dependencies&NS=Windsor&AspxAutoDetectCookieSupport=1上查看城堡 Windsor wiki 上的第二个示例

它认为这就是您要寻找的东西:)

container.Register( Component.For().ImplementedBy() .DependsOn(ServiceOverride.ForKey("Logger").Eq("secureLogger")) );

问候

于 2012-04-22T11:08:16.103 回答
0

我发布了一些非常类似的东西。我有两个接口实现,我希望 MVC 控制器使用我决定的其中一个实现。

文章中,我解释了一种方法,但随附的源代码显示了另外两种方法。

希望这可以帮助。

于 2014-09-21T03:19:28.110 回答