Orleans 1.5 依赖注入的实现
什么是依赖注入
依赖关系注入 (DI) 是一种软件设计模式,它实现控制反转以解决依赖关系。
奥尔良正在使用 ASP.NET 核心开发人员编写的抽象。有关其工作原理的详细说明,请查看官方文档。
DI 在 奥尔良
依赖注入目前仅在奥尔良的服务器端受支持。
奥尔良使得将依赖项注入应用程序 Grains 成为可能。
然而,奥尔良支持每个容器依赖的注入机制,最常用的方法之一是构造函数注入。
从理论上讲,可以注入以前在思洛存储器启动期间在 IService 集合中注册的任何类型。
注意:随着奥尔良的发展,根据目前的计划,也可以在其他应用程序类(如StreamProviders)中利用依赖关系注入。
配置扩展模块
DI 配置是全局配置值,必须在此处进行配置。
奥尔良正在使用与 ASP.NET 核心类似的方法来配置 DI。应用程序中必须有一个类,该类必须包含方法。它必须返回类型为 : 的对象实例。StartupConfigureServicesIServiceProvider
配置是通过下面描述的方法之一指定类的类型来完成的。Startup
注意:以前 DI 配置是在群集节点级别指定的,这在最新版本中已更改。
从代码配置
可以告诉奥尔良您喜欢使用哪种类型进行基于代码的配置。类上有一个名为的扩展方法,您可以使用它来执行此操作。StartupUseStartupClusterConfiguration
var configuration = new ClusterConfiguration();
configuration.UseStartupType<MyApplication.Configuration.MyStartup>();
通过 XML 进行配置
若要将类注册到 Orleans,必须向 部分添加一个 元素,并在属性中指定该类型的程序集限定名称。StartupStartupDefaultsType
<?xml version="1.0" encoding="utf-8" ?>
<tns:OrleansConfiguration xmlns:tns="urn:orleans">
<tns:Defaults>
<tns:Startup Type="MyApplication.Configuration.Startup,MyApplication" />
</tns:Defaults>
</tns:OrleansConfiguration>
例
下面是一个完整的类示例:Startup
namespace MyApplication.Configuration
{
public class MyStartup
{
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IInjectedService, InjectedService>();
return services.BuildServiceProvider();
}
}
}
此示例显示了 Grain 如何通过构造函数注入以及注入服务的完整声明和实现来利用:IInjectedService
public interface ISimpleDIGrain : IGrainWithIntegerKey
{
Task<long> GetTicksFromService();
}
public class SimpleDIGrain : Grain, ISimpleDIGrain
{
private readonly IInjectedService injectedService;
public SimpleDIGrain(IInjectedService injectedService)
{
this.injectedService = injectedService;
}
public Task<long> GetTicksFromService()
{
return injectedService.GetTicks();
}
}
public interface IInjectedService
{
Task<long> GetTicks();
}
public class InjectedService : IInjectedService
{
public Task<long> GetTicks()
{
return Task.FromResult(DateTime.UtcNow.Ticks);
}
}
测试框架集成
当与测试框架结合使用以验证构建的代码的正确性时,DI确实大放异彩。您可以按照我们的教程阅读有关在奥尔良进行测试的组件的信息。
您需要执行两项操作来设置 DI 与测试。首先,您需要实现服务的模拟。这是在我们的示例中使用 Moq(一种流行的 .NET 模拟框架)完成的。下面是模拟服务的示例。
public class MockServices
{
public IServiceProvider ConfigureServices(IServiceCollection services)
{
var mockInjectedService = new Mock<IInjectedService>();
mockInjectedService.Setup(t => t.GetTicks()).Returns(knownDateTime);
services.AddSingleton<IInjectedService>(mockInjectedService.Object);
return services.BuildServiceProvider();
}
}
若要将这些服务包含在测试接收器中,需要将 MockServices 指定为接收器启动类。下面是执行此操作的示例。
[TestClass]
public class IInjectedServiceTests: TestingSiloHost
{
private static TestingSiloHost host;
[TestInitialize]
public void Setup()
{
if (host == null)
{
host = new TestingSiloHost(
new TestingSiloOptions
{
StartSecondary = false,
AdjustConfig = clusterConfig =>
{
clusterConfig.UseStartupType<MockServices>();
}
});
}
}
}
依赖关系注入|微软奥尔良网站 (centur.github.io)
浙公网安备 33010602011771号