我正在使用 Microsoft Orleans,并且我有一个名为 ConsumerGrain 的颗粒,它通过订阅的 id 与 Azure 订阅相关联。为符合 SOLID 原则,注入了多个应用程序服务。某些应用程序服务需要订阅的 id。我不想在每个方法调用上传递订阅 id,而是将一个 ISubscriptionContext 对象注入到每个需要当前订阅 id 的应用程序服务中,并且我希望每个grain的对象图创建一次服务实例,所以它不可能是 Transient 而不是 Singleton 的生活方式。Scoped 生活方式可以在这里使用吗?
问问题
1095 次
2 回答
0
Orleans仅IServiceProvider
将 SiloStartup
类返回的数据用于颗粒解析。这意味着应用程序可以在类中返回具有以下逻辑的复合 IServiceProvider Startup
:
IServiceProvider
基于Orleans提供的构建一个IServiceCollection
,用于解析Orleans内部颗粒。- 为应用程序的颗粒和服务构建一个
IServiceProvider
,假设使用 SimpleInjector 和每个对象图的生活方式。 - 返回一个
IServiceProvider
首先尝试使用基于奥尔良的解决方案IServiceProvider
,如果失败则使用基于应用程序的解决方案IServiceProvider
。
该类Startup
只需要在其中有一个与此签名匹配的方法:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
return services.BuildServiceProvider();
}
这个片段BuildServiceProvider()
是由 Microsoft.Extensions.DependencyInjection 提供的吗
于 2016-03-16T07:24:31.043 回答
0
有更详细的解释:
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>
于 2016-10-17T09:52:11.900 回答