答案 0 :(得分:2)
我会直言不讳地说,你提出这个问题并根据你提出的解决方案这一事实,你并没有对手头的问题采取鸟瞰建筑观点。我不知道你的应用程序的私密细节,但能够有一点展望和能够描绘将来可能会用到的东西将有助于URI设计。
您提出的解决方案都围绕着非常具体的程序化细节,而问题是抽象的,根本不涉及编程。解决问题的方法就是写下你域中的实体,可以对它们执行的操作以及它们之间的关系。
BilldehÓra有一篇关于Web resource mapping criteria for frameworks(here'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中的类型。
让我知道你的想法。