如何在运行时使用Akka.NET中的工厂将参数传递给DI容器?

时间:2015-10-28 07:37:08

标签: c# autofac akka.net

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

0 个答案:

没有答案