1

MvcSiteMapProvider v4 の場合、SiteMapNodeUrlResolverBase をオーバーライドしてカスタム サイトマップ URL リゾルバーを作成しました。しかし、それを MvcSiteMapProviderRegistry に登録して、ノードの Url が常に独自の SiteMapNodeUrlResolver を使用して解決されるようにする方法がわかりません。

私は次のようなものを期待していました:

this.For<ISiteMapNodeUrlResolver>().Use<MyUrlResolver>();

しかし、これはうまくいきません。どうすればよいですか?

4

1 に答える 1

0

SiteMapNodeUrlResolvers (可視性プロバイダーおよび動的ノード プロバイダーと共に) は戦略パターンを使用するため、複数のインスタンスを関連付けてから、各インスタンスを名前で参照できます。その名前は、AppliesTo()メソッドによって使用され、各ノードに使用する URL リゾルバーが決定されます。

ISiteMapNodeUrlResolver を実装するのではなく、SiteMapNodeUrlResolverBase から継承する場合AppliesTo()、ほとんどの場合、デフォルトの実装が機能します。次に、この行 (既定でモジュールに既に含まれています) は、すべての SiteMapNodeUrlResolvers を自動的に接続します。

// Multiple implementations of strategy based extension points
CommonConventions.RegisterAllImplementationsOfInterface(
    (interfaceType, implementationType) => this.For(interfaceType).Singleton().Use(implementationType),
    multipleImplementationTypes,
    allAssemblies,
    excludeTypes,
    "^Composite");

デフォルトでは、MvcSiteMapProvider.dll と MVC プロジェクトのみをスキャンします。別のアセンブリで URL リゾルバーを定義している場合は、allAssemblies 変数を変更して、カスタム アセンブリが確実に含まれるようにする必要があります。

ロードしたら、名前で呼び出す必要があります。既定の実装では、"ShortAssemblyQualifiedName" が使用されます。これは、構成ファイル内の型を参照するために通常使用する文字列と同じです (アセンブリに厳密な名前が付けられていない場合)。

<mvcSiteMapNode title="Home" action="Index" controller="Home" urlResolver="MyNamespace.MySiteMapNodeUrlResolver, MyAssembly" />

urlResolver プロパティ/属性は、デフォルトの実装をオーバーライドするすべてのノードで設定する必要があります。

必要に応じて、AppliesTo() メソッドを自分で実装して、必要な構成の量を短縮できます。内部 DI コンテナーは構成からの型名を使用してオブジェクトをインスタンス化するため、これは外部 DI コンテナーを使用する場合にのみ機能することに注意してください。

public override bool AppliesTo(string providerName)
{
    return "myUrlResolver".Equals(providerName, StringComparison.InvariantCulture);
}

<mvcSiteMapNode title="Home" action="Index" controller="Home" urlResolver="myUrlResolver" />
于 2013-10-15T10:38:38.833 に答える