新文章 网摘 文章 随笔 日记

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)
posted @ 2022-09-28 10:04  岭南春  阅读(71)  评论(0)    收藏  举报