簡體   English   中英

在Web API 2中正確使用Autofac的生存期范圍

[英]Correct usage of lifetime scope of Autofac in web api 2

我是autofac的新手。 我在新的Web api 2項目上使用它。 以下是由Global.asax的Application_Start()方法調用的我的autofac配置代碼。 我不確定InstancePerRequest()的用法是否正確。 更重要的是,它甚至根本不需要使用嗎? 或者,我應該使用其他選項,例如InstancePerLifeTimeScopre()或InstancePerDependency()? 無論我是否使用這些生存期范圍選項中的任何一個,在調試期間,它們都會產生相同的結果。

public class IocConfig
{
    //Autofac configuration
    public static void Configure()
    {
        ContainerBuilder builder = new ContainerBuilder();
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
        builder.RegisterType<DeliveryCode>().As<IDeliveryCode>() 
         .InstancePerRequest();
        builder.RegisterType<DeliveryContext>().As<IDeliveryContext>()
         .InstancePerRequest();
        builder.RegisterType<DeliveryStrategy>().As<IDeliveryStrategy>() 
         .InstancePerRequest();
        IContainer container = builder.Build();
        AutofacWebApiDependencyResolver resolver = new 
            AutofacWebApiDependencyResolver(container);
        GlobalConfiguration.Configuration.DependencyResolver = resolver;
    }
}

確定依賴項的生存期實際上取決於應用程序的需求。 例如,如果您有一個用於檢索常數值的依賴項,則它可能最適合作為單例,以便在應用程序的整個生命周期中僅檢索一次這些值。

如果您還沒有的話,建議您查看有關“控制作用域和生命周期”的Autofac文檔 它很好地概述了實例范圍的類型(即InstancePerLifeTimeScope()InstancePerDependency() )之間的差異以及它們的行為方式。

InstancePerDependency-為每個依賴項獲取一個新對象。 客戶端之間永遠不會共享對象。 我會說僅在需要時才使用它,因為它比其他方法更慢並且使用更多的內存。 但這是非常安全的,因為每個依賴項都是一個私有對象。

InstancePerRequest-為一個Web api調用獲得一個新對象。 當您要為每個api調用創建一個新對象,然后在此特定api調用期間在所有其他對象之間共享它時,這很有用。

InstancePerLifeTimeScope-這與以前的類似,但是更通用。 您通常不需要此,只需忽略即可。 :-)

SingleInstance-僅在全局創建一個實例,在不同的Web API調用和所有對象之間共享。 對全球數據提供者有用,無狀態類向其他人提供“服務”等。

請注意,“每個依賴項”和“單個實例”彼此相反。 而“每個請求”介於兩者之間,是針對Web API量身定制的。 :-)

另請注意,如果您嘗試了它們,但它們的表現似乎相同,則可能是因為您的測試是錯誤的。 但這也可以是事實-無狀態服務可以注冊為任何類型,並且可以正常運行。 如果在其他注冊類型合適的情況下使用逐個依賴關系,則效率較低。 同樣,在單例適用的情況下,按請求使用效率較低。 但這僅僅是優化。 另一方面,如果您的類是有狀態的,並且在您實際上需要單獨的實例時錯誤地將其注冊為單例,則您的程序將表現為錯誤,這比不充分的優化要大得多。

暫無
暫無

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

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