Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用structuremap IoC解析应用程序核心内的公共路由_C#_Asp.net Mvc 3_Structuremap_Webforms_Asp.net Routing - Fatal编程技术网

C# 使用structuremap IoC解析应用程序核心内的公共路由

C# 使用structuremap IoC解析应用程序核心内的公共路由,c#,asp.net-mvc-3,structuremap,webforms,asp.net-routing,C#,Asp.net Mvc 3,Structuremap,Webforms,Asp.net Routing,我们已经开始执行我们的框架站点的Mvc3实现的任务,目前使用我们现有的WebForms实现 这项任务使我们能够将IoC和DI与Structuremap集成,以实现灵活性 为了让您了解一些背景,我们有以下项目结构: App.Core我想我在 只要覆盖具有相同的构造函数,我认为: public static IRouteResolver RouteResolver(this Control control) { return ObjectFactory.With("control").Equ

我们已经开始执行我们的框架站点的Mvc3实现的任务,目前使用我们现有的WebForms实现

这项任务使我们能够将IoC和DI与Structuremap集成,以实现灵活性

为了让您了解一些背景,我们有以下项目结构:


App.Core我想我在

只要覆盖具有相同的构造函数,我认为:

public static IRouteResolver RouteResolver(this Control control)
{
    return ObjectFactory.With("control").EqualTo(control).GetInstance<IRouteResolver>();
}
public static IRouteResolver RouteResolver(this Page page)
{
    return ObjectFactory.With("page").EqualTo(page).GetInstance<IRouteResolver>();
}
公共静态IRouteResolver路由解算器(此控件)
{
返回ObjectFactory.With(“control”).EqualTo(control).GetInstance();
}
公共静态IRouteResolver路由解算器(本页)
{
返回ObjectFactory.With(“page”).EqualTo(page).GetInstance();
}

可能会起作用,出来做一些测试

我采取了另一种方法,上面的方法在核心上不起作用。我现在只依赖RouteCollection和HttpContext来解析路由:

    public abstract class BaseRouteResolver : IRouteResolver
{
    protected HttpContext _context;
    protected RouteCollection _routeCollection;
    public BaseRouteResolver()
        :this(RouteTable.Routes, HttpContext.Current)
    {

    }
    public BaseRouteResolver(RouteCollection routeCollection, HttpContext context)
    {
        _routeCollection = routeCollection;
        _context = context;
    }

    public string GetRouteUrl(object routeParameters)
    {
        return GetRouteUrl(new RouteValueDictionary(routeParameters));
    }
    public string GetRouteUrl(System.Web.Routing.RouteValueDictionary routeParameters)
    {
        return GetRouteUrl(null, new RouteValueDictionary(routeParameters));
    }
    public string GetRouteUrl(string routeName, object routeParameters)
    {
        return GetRouteUrl(routeName, new RouteValueDictionary(routeParameters));
    }
    public string GetRouteUrl(string routeName, System.Web.Routing.RouteValueDictionary routeParameters)
    {
        VirtualPathData virtualPath = _routeCollection.GetVirtualPath(_context.Request.RequestContext, routeName, routeParameters);
        if (virtualPath != null)
            return virtualPath.VirtualPath;
        return null;
    }

    public abstract string GetUrlFor(Product product);

    public abstract string GetUrlFor(Category category);

    public abstract string GetUrlFor(Brand brand);
}

忘了提到,在SM上注册IRouteResolver是在每个类库上通过使用SM注册表类和()的设置来完成的;
public class WebRouteResolver : IRouteResolver
{
    Control _control;
    HttpContext _context;
    public WebRouteResolver()
        :this(HttpContext.Current)
    {

    }
    public WebRouteResolver(HttpContext context)
    {
        _context = context;
    }
    public WebRouteResolver(Control control)
    {
        _control = control;
    }
    public WebRouteResolver(Page page)
    {
        _control = page as Control;
    }

    public string GetRouteUrl(object routeParameters)
    {
        return GetRouteUrl(new RouteValueDictionary(routeParameters));
    }
    public string GetRouteUrl(System.Web.Routing.RouteValueDictionary routeParameters)
    {
        return GetRouteUrl(null, new RouteValueDictionary(routeParameters));
    }
    public string GetRouteUrl(string routeName, object routeParameters)
    {
        return GetRouteUrl(routeName, new RouteValueDictionary(routeParameters));
    }
    public string GetRouteUrl(string routeName, System.Web.Routing.RouteValueDictionary routeParameters)
    {
        VirtualPathData virtualPath = null;
        if(_control.IsNotNull())
            virtualPath = RouteTable.Routes.GetVirtualPath(_control.Page.Request.RequestContext, routeName, routeParameters);
        else
            virtualPath = RouteTable.Routes.GetVirtualPath(_context.Request.RequestContext, routeName, routeParameters);

        if (virtualPath != null)
        {
            return virtualPath.VirtualPath;
        }
        return null;
    }
    private string ResolveUrl(string originalUrl)
    {
        if(_control.IsNotNull())
            return _control.ResolveUrl(originalUrl);

        // *** Absolute path - just return
        if (originalUrl.IndexOf("://") != -1)
            return originalUrl;

        // *** Fix up image path for ~ root app dir directory
        if (originalUrl.StartsWith("~"))
        {
            string newUrl = "";
            if (_context != null)
                newUrl = _context.Request.ApplicationPath +
                      originalUrl.Substring(1).Replace("//", "/");
            else
                // *** Not context: assume current directory is the base directory
                throw new ArgumentException("Invalid URL: Relative URL not allowed.");

            // *** Just to be sure fix up any double slashes
            return newUrl;
        }

        return originalUrl;
    }

    public string GetUrlFor(Product product)
    {
        string category = string.Empty;
        if (product.Categories.Count > 0)
            category = product.Categories[0].Breadcrumb.Replace("@@", "-");
        else if (product.Brands.Any())
            category = product.Brands.FirstOrDefault().Name;
        else
            category = "detail";

        if (Config.RoutingEnabled)
        {
            return GetRouteUrl(new { @category = CommonHelper.ToFriendlyUrl(category), name = CommonHelper.ToFriendlyUrl(product.Name), id = product.Id });
        }
        return ResolveUrl(Config.GetStoreSetting("productDetailUrl")) + "?id={0}&name={1}&category={2}".Fill(product.Id, CommonHelper.ToFriendlyUrl(product.Name), CommonHelper.ToFriendlyUrl(category));
    }
    public string GetUrlFor(Category category)
    {
        string breadcrumb = category.Breadcrumb.Replace("@@", "-");
        if (Config.RoutingEnabled)
            return GetRouteUrl(new { @category = CommonHelper.ToFriendlyUrl(breadcrumb), category_id = category.Id});

        return ResolveUrl(Config.GetStoreSetting("productListingUrl") + "?category_id={0}&category={1}".Fill(category.Id, CommonHelper.ToFriendlyUrl(category.Name)));
    }
    public string GetUrlFor(Brand brand)
    {
        if (Config.RoutingEnabled)
            return GetRouteUrl(new { @brand = CommonHelper.ToFriendlyUrl(brand.Name), brand_id = brand.Id });

        return ResolveUrl(Config.GetStoreSetting("productListingUrl") + "?brand_id={0}&brand={1}".Fill(brand.Id, CommonHelper.ToFriendlyUrl(brand.Name)));
    }
}
public static IRouteResolver RouteResolver(this Control control)
{
    return new WebRouteResolver(control);
}
public static IRouteResolver RouteResolver(this Page page)
{
    return new WebRouteResolver(page);
}
public static IRouteResolver RouteResolver(this Control control)
{
    return ObjectFactory.With("control").EqualTo(control).GetInstance<IRouteResolver>();
}
public static IRouteResolver RouteResolver(this Page page)
{
    return ObjectFactory.With("page").EqualTo(page).GetInstance<IRouteResolver>();
}
    public abstract class BaseRouteResolver : IRouteResolver
{
    protected HttpContext _context;
    protected RouteCollection _routeCollection;
    public BaseRouteResolver()
        :this(RouteTable.Routes, HttpContext.Current)
    {

    }
    public BaseRouteResolver(RouteCollection routeCollection, HttpContext context)
    {
        _routeCollection = routeCollection;
        _context = context;
    }

    public string GetRouteUrl(object routeParameters)
    {
        return GetRouteUrl(new RouteValueDictionary(routeParameters));
    }
    public string GetRouteUrl(System.Web.Routing.RouteValueDictionary routeParameters)
    {
        return GetRouteUrl(null, new RouteValueDictionary(routeParameters));
    }
    public string GetRouteUrl(string routeName, object routeParameters)
    {
        return GetRouteUrl(routeName, new RouteValueDictionary(routeParameters));
    }
    public string GetRouteUrl(string routeName, System.Web.Routing.RouteValueDictionary routeParameters)
    {
        VirtualPathData virtualPath = _routeCollection.GetVirtualPath(_context.Request.RequestContext, routeName, routeParameters);
        if (virtualPath != null)
            return virtualPath.VirtualPath;
        return null;
    }

    public abstract string GetUrlFor(Product product);

    public abstract string GetUrlFor(Category category);

    public abstract string GetUrlFor(Brand brand);
}