簡體   English   中英

IAclModule如何工作

[英]How IAclModule works

我想知道IAclModule這個類到底是如何工作的,我的意思是它通過的過程,每個循環實例化一個以驗證用戶的訪問權限,還是每次都使用相同的實例?

我問這是因為我需要實現自己的邏輯,因為默認的AuthorizeAttributeAclModule和XmlRolesAclModule太慢了。

謝謝。

AclModule由DI(依賴注入)容器實例化。 使用內部DI容器時,它由SiteMapFactoryContainer.ResolveAclModule方法實例化。 但是,無論使用內部DI還是外部DI,實例都通過存儲在SiteMapPluginProvider類的私有字段中而保持活動狀態(並因此在緩存中),而該實例又位於SiteMapPluginProvider類的私有字段中。 SiteMap類。 因此,每個SiteMap有1個實例,默認情況下,該實例僅在每次緩存過期時才創建(默認情況下每5分鍾1次)。

AuthorizeAttributeAclModule已通過相當全面的測試,並且已進行了相當不錯的優化。 但是,它為每個節點創建了相關的控制器類和AuthorizeAttribute類的實例,因此,如果您的Controller或AuthorizeAttribute的任何自定義實現在構造函數中做了太多工作,則可能會遇到性能問題。

要解決此問題,您應該旨在通過Controller構造函數將依賴項注入每個控制器,而不是在構造函數內部進行繁重的工作。 如果將依賴項注入容器與自定義IControllerFactory結合使用 ,則可以從控制器外部控制依賴項的生存期。 如下例所示,使用這種方法時,可以為MyController的每個實例使用相同的IMyRepository實例。

public class MyController : Controller
{
    public MyController(IMyRepository repository)
    {
        if (repository == null)
            throw new ArgumentNullException("repository");
        this.repository = repository;
    }
    private readonly IMyRepository repository;

    public ActionResult Index()
    {
        var items = this.repository.GetList()

        return View(items);
    }
}

對於控制器的設計,這是推薦的最佳實踐,但是在緊要關頭,如果創建依賴項的開銷很大,那么也可以請求緩存您的依賴項,因此每個控制器實例的創建都不會那么耗時每個請求超過一次。

public class MyController : Controller
{
    public MyController()
    {
        this.repository = this.GetOrCreateRepository();
    }
    private readonly IMyRepository repository;

    private IMyRepository GetOrCreateRepository()
    {
        var key = "MyControllerRepository";
        var result = HttpContext.Items[key];
        if (result == null)
        {
            // If the expensive dependency wasn't already created for this request, do it now
            result = new MyRepository();

            // Save the instance in the request, so the next time this controller is created,
            // it doesn't have to instantiate it again.
            HttpContext.Items[key] = result;
        }
        return result;
    }

    public ActionResult Index()
    {
        var items = this.repository.GetList()

        return View(items);
    }
}

此外,如果您具有自定義的AuthorizeAttribute(s),則應確保他們除了檢查用戶是否被授權外,不執行任何其他工作, 將真實工作委托給處理程序 ,方法與Microsoft相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM