2016-02-04 135 views
3

我對Autofac依賴注入非常新,我得到了與我的項目相關的這些問題。我已經閱讀了很多文章,但對於我的一些問題我沒有清晰的瞭解。 Mine是.Net REST API上的服務應用程序。我正在做App_Start模塊的實例註冊,如下所示。InstancePerLifeTimeScope和對象的生命週期

private static IContainer RegisterServices(ContainerBuilder builder) 
     { 
      builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
      builder.RegisterType<DCLMessengerContext>() 
        .As<DbContext>() 
        .ExternallyOwned() 
        .InstancePerLifetimeScope(); 
      builder.RegisterType<DbFactory>() 
        .As<IDbFactory>() 
        .ExternallyOwned() 
        .InstancePerLifetimeScope(); 
      builder.RegisterType<UnitOfWork>() 
        .As<IUnitOfWork>() 
        .InstancePerLifetimeScope(); 
      builder.RegisterGeneric(typeof(EntityBaseRepository<>)) 
        .As(typeof(IEntityBaseRepository<>)) 
        .InstancePerLifetimeScope(); 
      builder.RegisterType<PersonServiceClient>() 
        .As<IPerfService>() 
        .InstancePerLifetimeScope(); 
      builder.RegisterType<PagingServiceContractClient>() 
        .As<PagingServiceContract>() 
        .InstancePerLifetimeScope(); 
      builder.RegisterType<MessageService>() 
        .As<IMessageService>() 
        .InstancePerLifetimeScope(); 
      Container = builder.Build(); 
      return Container; 

     } 

我的服務層是「MessageService」有我在執行所有DB等一體化業務,並通過構造函數注入得到的實例。這些是我在這個實現中遇到的問題。

  1. 我使用InstancePerLifeTimeScope作爲我的所有註冊。這是正確的方法嗎?在每個控制器請求(http請求)的生命週期之後,這些實例是否會自動處理?
  2. 我們是否需要手動實現任何這些實例上的任何Dispose操作? (我的代碼中沒有任何非託管對象)
  3. 從服務方法來說,我需要使用Task.Run()來創建火&忘記線程。什麼是最好的方法供應實例,以防止這種火災&忘記線程?如果我使用InstancePerLifeTimeScope,我可以看到新線程也獲得了通過服務類可用的相同實例,所以我只是在這些實例被丟棄時感到困惑?
+0

請參閱[「應該在其標題中包含」標籤?「](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles) ,那裏的共識是「不,他們不應該」! –

+0

感謝您對此進行更新。我希望我可以將傾斜更新爲「Autofac中的InstancePerLifeTimeScope和對象的生命週期」。另外,我希望在添加額外的標籤(不包括標題),在這種情況下「ASP.Net Web API」不會有任何問題? –

+0

這將使一個完美的編輯! –

回答

1

當您解決每一生範圍組件實例,你如果要在控制器使用它們每嵌套範圍

  1. 因此獲得 單個實例。你將有一個對象爲每個請求,他們將被處置。但是如果你在一個單身物體中解決它們,他們將會與這個物體一起生活。

這是正確的做法嗎?

這取決於你的需要。如果你需要單身對象,那不是。如果你只是想在請求範圍中使用這個服務,使用instanceperrequest更好。

  1. Autofac自動調用處理IDisposable對象。如果您需要配置方法 ,請執行它。這與autofac無關。
  2. 如果在此線程中使用另一個線程解析對象。否則,當請求處理你的對象將被丟棄,你的線程將失敗。檢查this
+0

謝謝你的所有反饋 在我的情況下,正如我所提到的,我將所有對象聲明爲'InstancePerLifeTimeScope'。根據我的理解,這些對象將在請求(http服務調用)的整個生命週期中可用。當我在其中一些實例上實現Dispose()時,我可以看到Autofac框架正在自動調用dispose並處理它們。 (由於字符限制,拆分我的意見) –

+0

1.我的問題是,如果我沒有在這些類上實現dispose接口,這些實例是否會留在內存中,並且此對象可能導致應用程序上的內存泄漏,並最終導致應用程序將會死?意思是,除非我們進行應用程序池回收,否則這些對象將永遠不會清理乾淨。 –

+0

2.如果上面的語句是真的,並且建議在所有實例上實現Dispose,在我的情況下,我必須在使用Autofac註冊的所有對象上實現Dispose?另外我有很多我通過Autofac註冊類在內部創建的類,我們是否需要在所有這些對象上實現Dispose?總之,如果我們使用Autofac註冊或內部創建任何實例(直接使用新關鍵字)? –