2010-11-15 84 views
2

是否可以在不註冊容器的情況下解析autofac中的服務?在不註冊服務類型的情況下解析autofac中的服務

到目前爲止,我想出了這樣的事情:

public object ResolveUnknownService(IContainer container, Type serviceType) 
    { 
     ILifetimeScope lifetimeScope = container.BeginLifetimeScope(b => b.RegisterType(serviceType).ExternallyOwned()); 
     try 
     { 
      return lifetimeScope.Resolve(serviceType); 
     } 
     finally 
     { 
      lifetimeScope.Dispose(); 
     } 
    } 

它的工作原理,但我有點擔心的表現。我也不想使用AnyConcreteTypeNotAlreadyRegisteredSource,因爲我想具體說明我想要(或不想)以這種方式解決哪些服務。

回答

1

在您的示例中,處置臨時生存期範圍將處理返回的對象及其任何相關性;組件的壽命與其解決的壽命範圍一樣長。

是否有任何已知的標準來識別這些類型? AnyConcrete...類的構造函數有一個過載,它可以指定一個過濾器來解析它的內容。如果有這樣的標準,那麼RegisterAssemblyTypes()幾乎總是一個更好的選擇。

(除非你用傳統/第三方框架集成那麼這種模式很可能不使用Autofac的最佳方式,因爲它會導致下來了服務定位器路徑。當然情況因人而異。)

+0

在我例如,我在註冊結束時使用了ExternallyOwned,所以我認爲組件應該在臨時生命週期範圍處理後生存。 – tomazv 2010-11-16 07:35:30

+0

主要場景是我們的應用程序中的插件系統。插件可以通過構造函數注入它們的依賴關係,並且只有在解析時才知道一些依賴關係。我們用對象/插件工廠中的輸入參數來包裝Autofac。 API用法如下所示:objectFactory.New(typeof(MyPlugin))。WithParameter(typeof(MyDependency),myDependencyValue).Build()。這會創建MyPlugin的新實例。類型MyDependency可能在構造函數中,也可能不在構造函數中,也可能有其他依賴項已經被Autofac註冊。 – tomazv 2010-11-16 08:13:27

+0

如果組件具有一次性依賴關係,則無論是否使用「ExternallyOwned()」,這些依賴關係都將被處置。解決並維持一個「擁有的」對你來說可能是更好的選擇。您可能還會對MEF(和Autofac)可以結合IEnumerable 和Lazy 處理插件選擇場景的方式感興趣 - http://mef.codeplex.com/wikipage?title=Exports %20於是%20Metadata – 2010-11-18 09:00:43

相關問題