正如升级文档中所指出的,您不需要实现AppliesTo()。您可以从 SiteMapNodeVisibilityProviderBase 继承:
// Using Internal DI
public class MyImplementation : SiteMapNodeVisibilityProviderBase
{
HttpContextBase _context;
public MyImplementation()
{
_context = new HttpContextWrapper(HttpContext.Current);
}
public override bool IsVisible(ISiteMapNode node, IDictionary<string, object> sourceMetadata){
return !_context.Request.IsAuthenticated;
}
}
// Using External DI
public class MyImplementation : SiteMapNodeVisibilityProviderBase
{
HttpContextBase _context;
public MyImplementation(HttpContextBase context)
{
_context = context;
}
public override bool IsVisible(ISiteMapNode node, IDictionary<string, object> sourceMetadata){
return !_context.Request.IsAuthenticated;
}
}
传递 HttpContextBase 也比传递 HttpContext 更好,因为如果您决定开始进行单元测试,它很容易被模拟。然后,您可以使用称为 HttpContextWrapper 的 HttpContextBase 的 .NET 默认实现来包装静态实例。
请注意,内部 DI 容器需要一个默认的公共构造函数,因为它使用反射来实例化类。但是,如果使用外部 DI 容器,您可以将 HttpContextBase 传递到您的类中,因为如果您将构造函数参数注册到容器中,它将解析构造函数参数(同样,它将使其可单元测试)。
在 StructureMap(对于外部 DI)中,注册代码如下所示:
container.For<System.Web.HttpContext>().Use(t => System.Web.HttpContext.Current);
container.For<System.Web.HttpContextBase>().Use<System.Web.HttpContextWrapper>();