4

我有一个名为的父类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委托中实例化子类,如上例所示。

4

0 回答 0