在您的体系结构中,如何将URL与数据库层分离?业务对象层

时间:2011-10-29 16:25:57

标签: c# url architecture dynamic expando

4 个答案:

答案 0 :(得分:2)

我会直言不讳地说,你提出这个问题并根据你提出的解决方案这一事实,你并没有对手头的问题采取鸟瞰建筑观点。我不知道你的应用程序的私密细节,但能够有一点展望和能够描绘将来可能会用到的东西将有助于URI设计。

您提出的解决方案都围绕着非常具体的程序化细节,而问题是抽象的,根本不涉及编程。解决问题的方法就是写下你域中的实体,可以对它们执行的操作以及它们之间的关系。

BilldehÓra有一篇关于Web resource mapping criteria for frameworkshere's a cached version的博客文章,如果真正的一个仍然会给出HTTP 500错误),Joe Gregorio已经写了关于如何RESTify DayTrader应该给你的文章关于如何设想应用程序的完整URI空间的正确想法。规划,绘画,思考和写作就像你和你的团队需要做的那样。

如果设计了应用程序中URI的完整范围和空间,您就可以实现它了。然而,你这样做取决于你,然后我建议使用URI Templates来定义URI本身和常规代码来映射将处理URI的代码(be Controller s,{ {1}}或其他)。在ASP.NET MVC中,配置代码是针对RouteTable类编写的,而在OpenRasta中则是针对ResourceSpace类编写的。

答案 1 :(得分:0)

您认为需要将您的域名实体(书籍,杂志等)与其网址的任何意识分离,这是正确的。

您需要访问图书的唯一标识符(例如)Id - 在您的示例中, 12345 。应该在表示逻辑中处理任何其他分类元素,您可能希望为非WWW通道使用不同的URI结构吗?如果您以多语言启动网站?拥有/杂志/计算机/坚持在数据库中将是一个障碍。

您的SEO沙皇的要求可能会随着时间的推移而改变,因为在搜索引擎中排名更高的技术也会发生变化。

因此,这是URL routing的问题。

在ASP.NET Webforms解决方案中,您可以将以下条目添加到Global.asax文件中:

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(System.Web.Routing.RouteTable.Routes);
}

public static void RegisterRoutes(System.Web.Routing.RouteCollection routes)
{
    routes.MapPageRoute("Book",
        "{productType}/{categoryName}/{productName}/{productId}",
        "~/Books.aspx");

    routes.MapPageRoute("Magazine",
        "{productType}/{categoryName}/{productName}/{year}/{month}/{day}/{productId}",
        "~/Magazines.aspx");
}

Books.aspx和Magazines.aspx随后会收集网址的相关部分,其中包含:

var categoryName = Page.RouteData.Values["categoryName"];

当您收集到足够的信息来唯一标识要显示的产品时,您可以查询您的域/数据层以获取所需的信息。

当新产品类型可用时(或利益相关者请求新的URL结构),您只需添加另一条路线。

答案 2 :(得分:0)

也许是一台可以维护外部DSL的状态机。

Main
.*=Product
nj|ny=State
([a-z]*-)*=Title
20[1-9][1-9]->ExpectMonth =Year 
ExpectMonth
[0|1][0-9] = Month -> ExpectDay

... ECT

用T4生成结构代码

struct Url {
 string Product {get;set}
 string State {get;set;}
}

我认为“整体类”反模式可以通过代码生成来减轻。

答案 3 :(得分:0)

这是我第一次去#4。它工作正常,动态对象类型优雅。

public class ArticleDto 
{
//normal Article properties
//code goes here

//new dyamic property for the Uri Details
public dynamic UriDetails { get; set; }
}

然后我创建了一个自定义类来处理URI细节。我添加了一个名为+ id的构造函数,因为我总是希望传递一个资源名+ id,没有例外。

public class UriDetails : DynamicObject
{
    //TODO put error handling in here to ensure that they're not empty?
    public string ResourceName { get; set; }
    public int ResourceId { get; set; }

    public UriDetails(int resourceId, string resourceName)
    {
        ResourceId = resourceId;
        ResourceName = resourceName;
    }
//other code that you need to override
}

然后,在我的DataAccess代码中

ArticleDto = new ArticleDto();
//Set the regular properties
//code goes here

//Set the mandatory uri properties
ArticleDto.UriDetails = new UriDetails(id, articleTitle);

//Set any other properties specific to this call
ArticleDto.Date = publishedDate;

一个注意事项:这解决了服务层的问题,但Web层仍然需要知道如何构建URL。这将是某种类型的辅助类/规则引擎,它将根据属性名称确定使用的内容。 UriDetails中的类型。

让我知道你的想法。