Dependency injection 如何配置Orleans DI容器来解析具有相同实例/粒度对象图的服务?

Dependency injection 如何配置Orleans DI容器来解析具有相同实例/粒度对象图的服务?,dependency-injection,orleans,Dependency Injection,Orleans,我正在使用Microsoft Orleans,我有一个名为ConsumerGrain的颗粒,它通过订阅的id与Azure订阅关联。该颗粒被注入了多个应用程序服务,以符合可靠的原则。某些应用程序服务需要订阅的id。我希望将IsSubscriptionContext对象注入到每个需要当前订阅id的应用程序服务中,而不是在每次方法调用时传递订阅id,我希望每个grain的对象图创建一次服务实例,所以这不可能是短暂的,不是单身生活方式。这里可以使用范围限定的生活方式吗?奥尔良仅将思洛启动类返回的ISer

我正在使用Microsoft Orleans,我有一个名为ConsumerGrain的颗粒,它通过订阅的id与Azure订阅关联。该颗粒被注入了多个应用程序服务,以符合可靠的原则。某些应用程序服务需要订阅的id。我希望将IsSubscriptionContext对象注入到每个需要当前订阅id的应用程序服务中,而不是在每次方法调用时传递订阅id,我希望每个grain的对象图创建一次服务实例,所以这不可能是短暂的,不是单身生活方式。这里可以使用范围限定的生活方式吗?

奥尔良仅将思洛
启动
类返回的
IServiceProvider
用于谷物解析。这意味着应用程序可以在
启动
类中返回具有以下逻辑的复合IServiceProvider:

  • 基于奥尔良提供的
    IServiceCollection
    构建一个
    IServiceProvider
    ,用于解析奥尔良内部颗粒
  • 为应用程序的粒度和服务构建一个
    IServiceProvider
    ,比如使用SimpleInjector和每对象图生活方式
  • 返回一个
    IServiceProvider
    ,首先尝试使用基于奥尔良的
    IServiceProvider
    解决问题,如果失败,则使用基于应用程序的
    IServiceProvider解决问题
  • 启动
    类只需要有一个与此签名匹配的方法:

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

    是否此代码段
    BuildServiceProvider()
    由Microsoft.Extensions提供。DependencyInjection

    奥尔良仅将思洛
    Startup
    类返回的
    IServiceProvider
    用于文件解析。这意味着应用程序可以在
    启动
    类中返回具有以下逻辑的复合IServiceProvider:

  • 基于奥尔良提供的
    IServiceCollection
    构建一个
    IServiceProvider
    ,用于解析奥尔良内部颗粒
  • 为应用程序的粒度和服务构建一个
    IServiceProvider
    ,比如使用SimpleInjector和每对象图生活方式
  • 返回一个
    IServiceProvider
    ,首先尝试使用基于奥尔良的
    IServiceProvider
    解决问题,如果失败,则使用基于应用程序的
    IServiceProvider解决问题
  • 启动
    类只需要有一个与此签名匹配的方法:

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

    是否此代码段
    BuildServiceProvider()
    由Microsoft.Extensions.DependencyInjection提供

    以下是更详细的说明:

    重要的是要知道,您必须在奥尔良的配置文件中设置Startup类

    <?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> 
    

    以下是更详细的说明:

    重要的是要知道,您必须在奥尔良的配置文件中设置Startup类

    <?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> 
    
    
    
    有趣的问题。我没有在奥尔良看到任何主要的IoC libs集成包。通常情况下,IoC容器有两种解决这种情况的方法:在Autofac中手动启动LiveTimeScope,或在Castle.Winsdor中将作用域与图形中的对象关联,如在Autofac中拥有的LifeStyle.BoundTo。在Unity DI中,有一种类似于“每个解析生命周期管理器”的方法。由于奥尔良使用ASP.NET核心DI,这是一种所谓的依赖项解决方案,因此不存在这种类型的依赖项解决方案。一种解决方案是为每个grain实例打开一个作用域,并将依赖项注册为作用域单例。但只要一种谷物被实例化,奥尔良基础设施就应该打开这个范围。因此,当谷物被停用时,范围应该被关闭。有趣的问题。我没有在奥尔良看到任何主要的IoC libs集成包。通常情况下,IoC容器有两种解决这种情况的方法:在Autofac中手动启动LiveTimeScope,或在Castle.Winsdor中将作用域与图形中的对象关联,如在Autofac中拥有的LifeStyle.BoundTo。在Unity DI中,有一种类似于“每个解析生命周期管理器”的方法。由于奥尔良使用ASP.NET核心DI,这是一种所谓的依赖项解决方案,因此不存在这种类型的依赖项解决方案。一种解决方案是为每个grain实例打开一个作用域,并将依赖项注册为作用域单例。但只要一种谷物被实例化,奥尔良基础设施就应该打开这个范围。因此,当谷物失效时,应关闭范围。