使用 DI() Extension 从 ACtorSystem 创建 actorRefs,抛出对象引用异常
Creating actorRefs from ACtorSystem using DI() Extension, throws object reference exception
我正在尝试设置一个将使用 Autofac 进行依赖项注入的基础项目。
我在尝试获取执行以下操作的 Actor 实例时遇到以下问题:
_system = Akka.Actor.ActorSystem.Create(_settings.SystemName);
PingActor = _system.ActorOf(_system.DI().Props<PingActor>(), ActorNames.PingActor);
这会引发 'Object reference' 异常。 PingActor 为空。
下面是我如何在我的设置中加载我的模块,并注册 Actor 实例。
静态 class 包含帮助设置我的 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>();
}
}
为什么我的 Actor 为 Null?
我缺少 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}");
}
我正在尝试设置一个将使用 Autofac 进行依赖项注入的基础项目。
我在尝试获取执行以下操作的 Actor 实例时遇到以下问题:
_system = Akka.Actor.ActorSystem.Create(_settings.SystemName);
PingActor = _system.ActorOf(_system.DI().Props<PingActor>(), ActorNames.PingActor);
这会引发 'Object reference' 异常。 PingActor 为空。
下面是我如何在我的设置中加载我的模块,并注册 Actor 实例。
静态 class 包含帮助设置我的 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>();
}
}
为什么我的 Actor 为 Null?
我缺少 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}");
}