如何配置新奥尔良 DI 容器以解析具有相同实例的每个粒度对象图的服务



我使用的是Microsoft奥尔良,我有一个名为 ConsumerGrain 的粒度,它通过订阅的 id 与 Azure 订阅相关联。谷物注入了多种应用服务,以符合 SOLID 原则。某些应用程序服务需要订阅的 ID。我希望将 ISubscriptionContext 对象注入到需要当前订阅 ID 的每个应用程序服务,而不是在每个方法调用时传递订阅 ID,并且我希望每个粒度的对象图创建一次服务实例,因此它不能是暂时性而不是单例生活方式。可以在这里使用范围生活方式吗?

新奥尔良仅将 Silo Startup 类返回的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 提供

有更详细的解释:

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> 

相关内容

  • 没有找到相关文章

最新更新