我想使用 Autofac 委托工厂来解析对象图,其中一些嵌套对象需要传递参数。例如,如果Autofac 委托工厂示例中的 QuoteService需要一个 url 来检索数据,或者 QuoteService 本身具有需要参数的依赖项。
public class WebQuoteService : IQuoteService
{
public WebQuoteService(Uri source)
{
}
}
public class Shareholding
{
public Shareholding(string symbol, uint holding, IQuoteService quoteService)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我希望能够声明并注册一个委托,如下所示:
public delegate Owned<Shareholding> ShareholdingFactory(string symbol, uint holding,
Uri source);
builder.RegisterGeneratedFactory<ShareholdingFactory>();
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是 Autofac 无法解析 WebQuoteService 的 uri 参数。
我见过一些类似的问题和解决方案,但没有什么特别简洁的。Autofac-passing-parameter-to-nested-types建议注册 lambda 来显式实现工厂并解决嵌套依赖关系。我确信这会起作用,但是如果需要更深层次的参数或存在更多依赖项时,它会变得非常混乱。
我使用的临时解决方案是对此的改进,解析 Shareholding 中的 IQuoteService OnPreparing,并转发由 Autofac 生成的工厂创建的参数。
builder.RegisterType<Shareholding>().OnPreparing(e =>
{
e.Parameters = e.Parameters.Union(new[]
{
new TypedParameter(typeof (IQuoteService), e.Context.Resolve<IQuoteService>(e.Parameters))
}); …Run Code Online (Sandbox Code Playgroud)