5

読んでググって疲れ果ててしまったので、ガイダンスが必要な気がします。

これは、Castle Windsor 3.0の導入が原因の一部である可能性がありますが、ブログ投稿、SOの質問、およびその他のドキュメントのほとんどは、現在非推奨のコードであることがわかるものに明示的に依存しています。

だから:問題?

MVC3アプリケーションにバックエンドコードを提供するWCFサービスである私のアプリケーションには、複数のレイヤーがあり、そのうちの1つがファイルアップロードシステムにウイルススキャンサービスを提供します。

クライアントは複数のスキャンサービスのサポートを要求しました。当然、私はこれに準拠し、各スキャンサービスはIScanServiceインターフェイスを実装しています。

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

したがって、WCfサービスでは、コンストラクターは次のようになります。

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

注入されるIScanServiceが実装タイプMcAfeeScanService、NortonScanService、またはその他の実装であることをどのように特殊化できますか?

AFAIK Windsorは、デフォルトで、タイプがMcAfeeScanServiceであるかどうかに関係なく、最初に登録された実装を提供します。

ServiceOverridesを調べていましたが、これはDependsOn(Dependency.OnComponenent())を優先してWindsor 3.0で非推奨になっているようです[ただし、関連する例は見つかりませんでした] TypedFactoryFacilitiesとIHandlerSelectorも調べました。 、しかし、この(一見一般的でおそらく単純な)タスクにはいくつかのガイダンスが必要であると感じています。

皆さんありがとう。

4

3 に答える 3

7

ServiceOverrideはWindsor3で非推奨になりました。次のように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の最初の引数はバインディング名、2番目はコンポーネント名です。

于 2012-05-23T12:39:45.183 に答える
2

Castle Windsor wikiの2番目の例(http://docs.castleproject.org/Default.aspx?Page=Inline-Dependencies&NS=Windsor&AspxAutoDetectCookieSupport=1 )を見てください。

それはあなたが探しているものだと思います:)

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

よろしく

于 2012-04-22T11:08:16.103 に答える
0

こんな感じで投稿しました。インターフェイスの実装が2つあり、MVCコントローラーで、自分が決定した実装の1つを使用するようにしました。

記事ではそれを行う1つの方法を説明していますが、添付のソースコードは他の2つの方法を示しています。

お役に立てれば。

于 2014-09-21T03:19:28.110 に答える