抽象出Autofac工厂方法支持的正确方法是什么?
我一直得到这个例外:
此解决操作已经结束。使用lambdas注册组件时, 无法存储lambda的IComponentContext'c'参数。相反,要么 再次从'c'解析IComponentContext,或解析Func<>基于工厂创建 来自。
的后续组件
这是我尝试将其包起来的。
public void Register<T>(Func<IFactoryContext, T> factoryMethod)
{
_containerBuilder.Register<Func<Type, T>>(c => {
var ctx = c.Resolve<IComponentContext>();
return request => factoryMethod(new AutofacFactoryContext(ctx));
});
}
我甚至尝试过
public void Register<T>(Func<IFactoryContext, T> factoryMethod)
{
_containerBuilder.Register<Func<Type, T>>(c => {
var ctx = c.Resolve<IComponentContext>();
return request => factoryMethod(new AutofacFactoryContext((IComponentContext)ctx.Resolve(request)));
});
}
我想要一个返回T
的方法。
AutofacFactoryContext
是IFactoryContext
的一个实现,它只是Autofac IComponentContext
的一个包装。
最后这是我期待的结果:
bootstrapper.Register<IFoo>(c => new Foobar());
使用容器时:
var foobar = container.Resolve<IFoo>();
答案 0 :(得分:0)
我想以下内容可行:
public void Register<T>(Func<IFactoryContext, T> factoryMethod)
{
_containerBuilder.Register<Func<Type, T>>(c =>
request => {
var ctx = c.Resolve<IComponentContext>();
factoryMethod(new AutofacFactoryContext(ctx));
});
}
但请注意,这不会使用request
,就像您的第一个示例一样。由于我不确定你想在这里实现什么目标,我无法提出更好的选择。