Dependency injection 如何配置Orleans DI容器来解析具有相同实例/粒度对象图的服务?
我正在使用Microsoft Orleans,我有一个名为ConsumerGrain的颗粒,它通过订阅的id与Azure订阅关联。该颗粒被注入了多个应用程序服务,以符合可靠的原则。某些应用程序服务需要订阅的id。我希望将IsSubscriptionContext对象注入到每个需要当前订阅id的应用程序服务中,而不是在每次方法调用时传递订阅id,我希望每个grain的对象图创建一次服务实例,所以这不可能是短暂的,不是单身生活方式。这里可以使用范围限定的生活方式吗?奥尔良仅将思洛Dependency injection 如何配置Orleans DI容器来解析具有相同实例/粒度对象图的服务?,dependency-injection,orleans,Dependency Injection,Orleans,我正在使用Microsoft Orleans,我有一个名为ConsumerGrain的颗粒,它通过订阅的id与Azure订阅关联。该颗粒被注入了多个应用程序服务,以符合可靠的原则。某些应用程序服务需要订阅的id。我希望将IsSubscriptionContext对象注入到每个需要当前订阅id的应用程序服务中,而不是在每次方法调用时传递订阅id,我希望每个grain的对象图创建一次服务实例,所以这不可能是短暂的,不是单身生活方式。这里可以使用范围限定的生活方式吗?奥尔良仅将思洛启动类返回的ISer
启动类返回的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实例打开一个作用域,并将依赖项注册为作用域单例。但只要一种谷物被实例化,奥尔良基础设施就应该打开这个范围。因此,当谷物失效时,应关闭范围。