zoukankan      html  css  js  c++  java
  • Umbraco常见陷阱与错误模式

    今天在整理资料时,无意看到一篇比较重要的内容,关于Umbraco的【常见陷阱与模式】。

    在使用这类系统时,可能会受一些固化思维的影响,而忽略了系统本身的一些特性,导致一些类似于网站性能慢、反应慢、内存消耗高等问题。

    通过该文章,应当可以规避一些问题。

    大致包含一下一些方面:

    使用单例和静态化

    一般来说,如果编写过一些软件的话,你应该会使用到依赖注入规则。如果你是这么做的,那么你可能不会使用单例和静态化(在大多数情况下,也不该如此!),然而由于Umbraco并不是一个开放IoC容器,因此你应该发现你使用的是Umbraco提供的:ApplicationContext.Current 或者 UmbracoContext.Current。在大多数情况下你不应该使用这些单例访问器,它使你的代码很难测试,但更重要的是使用单例和静态化会让你的代码难于管理,API泄露,最终导致出现更多的问题。

    在所有的Umbraco基类中,你都可以使用它们暴露出来的属性,因此请使用它们进行替换!例如,在所有的Razor视图中,都由UmbracoContext暴露了UmbracoContext属性,由ApplicationContext暴露了ApplicationContext属性。在其他的基类中也都暴露了你所需要的实例,例如:SurfaceController,、UmbracoApiController,、UmbracoController、RenderMvcController,、UmbracoUserControl,、UmbracoPage、UmbracoHttpHandler,这个列表还将继续增加。

    所以你下次使用【ApplicationContext.Current】或者【UmbracoContext.Current】时,可以思考『为什么我这样做?』【是否已经暴露为我所要使用的属性?】【我使用依赖注入,我应该注入这个实例到我的类中】

    PS:大写的问号,【Singletons】和【Statics】这俩词真不知道该不该这么翻译。但是本章的意思,应该在于不要用类似于new ApplicationXXX()这样的方法去实现一个类,而是使用Umbraco提供的ApplcationContext和UmbracoContext这种属性操作数据。

    静态引用Web请求实例(例如UmbracoHelper):

    private static _umbracoHelper = new UmbracoHelper(UmbracoContext.Current);

    这种做法在使用_umbracoHelper时,会导致内存泄露以及数据的不一致。

    为什么?

    PS:好吧,,要点不需要理解,只要知道,不要生成静态对象,一般的私有变量就ok了。例如:

    private _umbracoHelper = new UmbracoHelper(UmbracoContext.Current);

    使用【Descendants】和【DescendantsOrSelf】查询:

    这不是一个100%的错误,当数据量少的时候没什么,但是在数据量多的时候,系统会迭代每一个子集节点并存入内存。此功能慎用,建议用【Children】来替代。

    使用过多的重复查询:

    查询内容不是没有开销的。因此在使用同样的查询时,建议定义变量存储查询结果。

    动态对象:

    在Umbraco8+版本中,将删除IPublishedContent的动态操作支持。大致就是说避免使用【CurrentPage】,用【Umbraco.TypeContent】和【Umbraco.TypeMedia】代替【Umbraco.Content】和【Umbraco.Media】。

    在视图中使用服务层:

    Umbraco服务层是直接操纵umbraco业务逻辑到数据库。这些方法都不应该在您的视图中使用,并且对应用程序的性能和稳定性有很大的影响。例如:

    var dontDoThis = ApplicationContext.Services.ContentService.GetById(123);

    你的视图应该只依靠只读数据访问的umbracohelper暴露的属性和方法。这可以确保被查询的数据是快速的(来自缓存),并且您不会无意中进行数据库更改。

    如果您正在视图中使用应用程序服务…那你至少应该弄清楚为什么这样做,在大多数情况下,最好删除这个逻辑。

    不要通过【UmbracoContext】来操作 【ApplicationContext】;

    不要用Umbraco Content Item来存储易变的数据,例如阅读量、访问量等

    减少Linq的使用,而改用XPath

    其他的,目前用不到,懒得再看了。。累死。。。。。

    参考:

    https://our.umbraco.org/documentation/Reference/Common-Pitfalls/

  • 相关阅读:
    WORD窗体保护密码清除
    在Fedora 23 Server和Workstation上安装LAMP(Linux, Apache, MariaDB和PHP)
    firefox 提示 ssl_error_unsupported_version 的解决方法
    算法题:求一个序列S中所有包含T的子序列(distinct sub sequence)
    Django模板输出Dict所有Value的效率问题
    笔记:LNK2001不代表链接器真的需要链接相关符号
    Windows Restart Manager 重启管理器
    advapi32.dll kernel32.dll 中的两套注册表API
    使用GDI+保存带Alpha通道的图像(续)
    使用GDI+保存带Alpha通道的图像
  • 原文地址:https://www.cnblogs.com/bashenandi/p/6532534.html
Copyright © 2011-2022 走看看