2

我正在使用 Microsoft Orleans,并且我有一个名为 ConsumerGrain 的颗粒,它通过订阅的 id 与 Azure 订阅相关联。为符合 SOLID 原则,注入了多个应用程序服务。某些应用程序服务需要订阅的 id。我不想在每个方法调用上传递订阅 id,而是将一个 ISubscriptionContext 对象注入到每个需要当前订阅 id 的应用程序服务中,并且我希望每个grain的对象图创建一次服务实例,所以它不可能是 Transient 而不是 Singleton 的生活方式。Scoped 生活方式可以在这里使用吗?

4

2 回答 2

0

Orleans仅IServiceProvider将 SiloStartup类返回的数据用于颗粒解析。这意味着应用程序可以在类中返回具有以下逻辑的复合 IServiceProvider Startup

  1. IServiceProvider基于Orleans提供的构建一个IServiceCollection,用于解析Orleans内部颗粒。
  2. 为应用程序的颗粒和服务构建一个IServiceProvider,假设使用 SimpleInjector 和每个对象图的生活方式。
  3. 返回一个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 回答