我有一个名为SearchEngineSupervisor
的父类,它创建SearchEngineWorker
个实例作为子actor。除了一些其他依赖项之外,我还需要在运行时创建它时将类SearchEngine
的实例传递给子SearchEngineWorker
类。
不使用DI,这看起来像是:
var props = Props.Create(() => new SearchEngineWorker(searchEngine, dependencyA, dependencyB));
var childRef = Context.ActorOf(props, "SearchEngineChild");
但是,我正在使用DI(Autofac)并且DI扩展上的Props方法没有超载接受参数。这是我唯一的选择:
var props = Context.DI().Props<SearchEngineWorker>();
在任何其他环境中,我会利用Autofac并将Func<SearchEngine, SearchEngineWorker>
之类的工厂委托注入SearchEngineSupervisor
父类,然后我将使用单个searchEngine
参数调用它来创建儿童。然后,Autofac将注入给定参数以及子类的其他依赖项。
我尝试使用以下内容:
var props = Props.Create(() => _workerFactory(searchEngine));
但是这会抛出一个异常,因为Create方法期望一个NewExpression类型的表达式,而不是InvocationExpression:
Unable to cast object of type 'System.Linq.Expressions.InvocationExpression' to type 'System.Linq.Expressions.NewExpression'.
我尝试了上述主题的几种变体,试图掩盖调用,包括使用具体的ISearchEngineWorkerFactory
对象,但到目前为止我的所有尝试都被挫败了,导致类似{{1} }
与此同时,我将子项的依赖项注入父InvalidCastException.
类,并直接在SearchEngineSupervisor
委托中实例化子类,如上例所示。