使用DI()扩展从ACtorSystem创建actorRefs,抛出对象引用异常

问题描述 投票:0回答:1

我正在尝试设置一个基础项目,它将利用Autofac进行依赖注入。

我有以下问题,当我试图让我的Actor的实例执行以下操作时:

_system = Akka.Actor.ActorSystem.Create(_settings.SystemName);
PingActor = _system.ActorOf(_system.DI().Props<PingActor>(), ActorNames.PingActor);

这会抛出“对象引用”异常。 PingActor为null。

下面是我如何在我的设置中加载我的模块,以及注册Actor实例。

包含帮助程序的静态类,以帮助设置我的Autofac设置。

public static class IoC
{
    public static IContainer Container { get; set; }

    public static void Bootstrapping(Action<ContainerBuilder> builderConfig)
    {
        //new builder instance
        var builder = new ContainerBuilder();
        builderConfig.Invoke(builder);
        Container = builder.Build();

        builder = new ContainerBuilder();
        builder.ScanAssembly();

        builder.Update(Container);
    }
}

这是ScanAssembly扩展方法:

public static class ContainerBuilderExtensions
{
    public static void ScanAssembly(this ContainerBuilder builder, string searchPattern = "Template.*.dll")
    {
        var path = AppDomain.CurrentDomain.BaseDirectory;
        foreach (var assembly in Directory.GetFiles(path, searchPattern).Select(Assembly.LoadFrom))
        {
            builder.RegisterAssemblyModules(assembly);
        }
    }
}

在哪里我尝试注册我的演员:

public class IoCModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<ActorSystemShell>().As<IActorSystemShell>();
        builder.RegisterType<PingActor>();
    }
}

为什么我的演员为Null?

c# .net autofac akka.net
1个回答
1
投票

我错过了AutoFacDependencyResolver。

我修改了我的代码,如下所示:

public void Start()
{
    _system = Akka.Actor.ActorSystem.Create(_settings.SystemName);

    // Create the dependency resolver
    IDependencyResolver resolver = new AutoFacDependencyResolver(IoC.Container, _system);

    PingActor = _system.ActorOf(_system.DI().Props<PingActor>(), ActorNames.PingActor);

    Console.WriteLine($"Starting actor system: {_settings.SystemName}");
}
© www.soinside.com 2019 - 2024. All rights reserved.