我的网址应如下所示:localhost/Products/Details/1/asus-intel-core-2-duo
。
如您所见,slug是从现有字段生成的:brand-processorBrand-ProcessorModel
。我的标题也将如此,没有破折号。我在我的服务层中生成了这个slug。我有两个问题:
我应该在何处以及如何存储此格式,以便我可以更改一次,其他所有内容都会更改?即。 {brand} {processorBrand} {ProcessorModel}
如何生成字符串?我只知道:string.Format("{0} {1} {2}", Model.Brand, Model.ProcessorBrand, Model.ProcessorModel)
。这似乎不适用于将格式存储在其他地方的情况。
如果我错了,我还有另一种方法。但这需要我遍历服务层中的每个产品,并在产品类上调用一个生成标题和slug的方法。例如。
public class Product
{
public void GenerateStuff();
//Other properties here...
public string Title {get; set;};
public string Slug {get; set;};
}
我知道有更好的方法可以做到这一点,我所拥有的每一种方法都显得非常混乱。
答案 0 :(得分:0)
无论你怎么做,它看起来都会涉及反射,这似乎是一个性能瓶颈。必须循环遍历模型上的每个属性似乎需要做很多次才能完成的工作。
国际海事组织,这是一个足够大的改变,而且不应该经常发生,我不会把它存储在任何地方。我会让代码在一个地方生成这个字符串,当它需要更改时,更改它,并重新构建应用程序。
答案 1 :(得分:0)
生成slug本身不属于Product
或任何其他域类。这与如何格式化slug,安全URL编码,允许字符等问题有关。 [顺便说一句,单独使用string.format不足以从域对象属性创建正确的URL编码字符串]。
因此,将slug生成方法保留在服务层中,但可能会将其更改为接受字符串值的枚举。
您的域对象类可以使用类似
的方法返回字符串值public IEnumerable<string> SlugValues {get {return new []{this.Brand, this.ProcessorModel} };
另一种方法是将属性添加到类或其中的属性,以表示在slug生成中使用哪些属性。现在,您可以使用反射找到要使用的内容。
答案 2 :(得分:0)
我们还需要唯一的URL slugs。
我们在数据库端做这个,使用触发器(是的,我知道触发器是邪恶的,裸露在我身边)
我们的产品实体有一个名为UniqueUri
的属性,该属性可以为空,并在首次创建产品时插入NULL。
然后我们在Products表上有一个INSERT / UPDATE触发器来生成唯一的URI。
触发器基本上查看所有现有产品,并且(使用某些逻辑/魔术)更新唯一URI。
这个(IMO)是这个逻辑所属的地方,并且是触发器的好例子。通过UI添加产品时,UI不必等待来创建URI。这样,它就是异步完成的(在某种意义上,至少从请求的角度来看)。
使用SQL循环遍历所有产品比在.NET中循环快得多。