2016-03-15 57 views
1

我正在使用Microsoft Orleans,並且我有一個名爲ConsumerGrain的穀物,它與訂閱ID的Azure訂閱相關聯。爲了符合SOLID原則,穀物被注入了多個應用服務。一些應用程序服務需要訂閱的ID。我不想在每個方法調用上傳遞訂閱ID,而是希望將ISubscriptionContext對象注入到每個需要當前訂閱ID的應用程序服務中,並且我希望每個grain的對象圖創建一次服務實例,所以它不可能是瞬態的而不是單身生活方式。這裏可以使用Scoped的生活方式嗎?如何配置Orleans DI容器來解析每個粒子對象圖具有相同實例的服務?

+0

有趣的問題。我沒有看到奧爾良的任何主要IoC庫集成包。一般來說,IoC容器有兩種解決此類情況的方法:像Autofac中手動的BeginLifetimeScope,或將範圍與圖形中的對象相關聯,如Castle.Winsdor中的LifeStyle.BoundTo,Autofac中的PerOwned。 – dadhi

+0

在Unity DI中,有一個像「每個解決生命期管理器」的東西。由於奧爾良使用的ASP.NET核心DI是一個所謂的[符合容器](https://simpleinjector.org/blog/2016/06/whats-wrong-with-the-asp-net-core-di-abstraction /)沒有這種類型的依賴關係解析。一種解決方案可能是爲每個穀物實例打開一個作用域,並將依賴關係註冊爲作用域單例。但是這個範圍應該由奧爾良基礎設施在穀物實例化時打開。因此,當糧食停用時,範圍應該是封閉的。 –

回答

0

奧爾良公司使用類返回的IServiceProvider只爲穀物解決。這意味着應用程序所用的Startup類與以下邏輯返回一個複合的IServiceProvider:

  1. 生成基於由新奧爾良提供的IServiceCollection一個IServiceProvider,用於解析奧爾良內部晶粒。
  2. 爲應用程序的穀物構建一個IServiceProvider &服務,比方說使用SimpleInjector和每個對象圖的生活方式。
  3. 返回IServiceProvider,首先嚐試使用基於奧爾良的IServiceProvider進行解析,並且如果使用基於IServiceProvider的應用程序失敗解決。

Startup類只是需要有一個方法,在它匹配此簽名:

public IServiceProvider ConfigureServices(IServiceCollection services) 
{ 
    return services.BuildServiceProvider(); 
} 

是這個片段BuildServiceProvider()由Microsoft.Extensions.DependencyInjection

提供
0

有更詳細的解釋at:

http://www.codeproject.com/Articles/1099750/How-to-implement-DI-support-in-your-Orleans-Silo

知道必須在orleans的配置文件中設置Startup Class很重要。

<?xml version="1.0" encoding="utf-8"?> 
<OrleansConfiguration xmlns="urn:orleans"> 
    <Globals> 
    <SeedNode Address="localhost" Port="10000" /> 
    </Globals> 
    <Defaults> 
    <Startup Type="Grains.Startup, Grains" /><!--important--> 
    <Networking Address="localhost" Port="10000" /> 
    <ProxyingGateway Address="localhost" Port="30000" /> 
    </Defaults> 
</OrleansConfiguration> 
相關問題