我使用的是Microsoft奥尔良,我有一个名为 ConsumerGrain 的粒度,它通过订阅的 id 与 Azure 订阅相关联。谷物注入了多种应用服务,以符合 SOLID 原则。某些应用程序服务需要订阅的 ID。我希望将 ISubscriptionContext 对象注入到需要当前订阅 ID 的每个应用程序服务,而不是在每个方法调用时传递订阅 ID,并且我希望每个粒度的对象图创建一次服务实例,因此它不能是暂时性而不是单例生活方式。可以在这里使用范围生活方式吗?
新奥尔良仅将 Silo Startup
类返回的IServiceProvider
用于粒度解析。这意味着应用程序可以在 Startup
类中返回具有以下逻辑的复合 IServiceProvider:
- 基于新奥尔良提供的
IServiceCollection
生成IServiceProvider
,用于解析新奥尔良内部粒度。 - 为应用程序的颗粒和服务构建一个
IServiceProvider
,假设使用具有每个对象图生活方式的SimpleInjector。 - 返回一个首先尝试使用基于新奥尔良的
IServiceProvider
进行解析的IServiceProvider
,如果失败,则使用基于应用程序的IServiceProvider
进行解析。
Startup
类只需要有一个与此签名匹配的方法:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
return services.BuildServiceProvider();
}
是这个代码段BuildServiceProvider()
由 Microsoft.Extensions.DependencyInjection 提供
有更详细的解释:
http://www.codeproject.com/Articles/1099750/How-to-implement-DI-support-in-your-Orleans-Silo
请务必知道,您必须在新奥尔良的配置文件中设置启动类。
<?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>