我有一个名为的父类SearchEngineSupervisor
,它创建SearchEngineWorker
子角色的实例。除了一些其他依赖项之外,我还需要在运行时创建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
对象,但到目前为止我的所有尝试都被挫败了,导致了类似的InvalidCastException.
同时,我将子类的依赖注入到父SearchEngineSupervisor
类中,并直接在Props.Create
委托中实例化子类,如上例所示。