C# 抽象出Autofac';s工厂方法支持
提取Autofac工厂方法支持的正确方法是什么 我一直得到这样的例外: 此解析操作已结束。使用lambdas注册组件时, 无法存储lambda的IComponentContext“c”参数。相反,也不是 从“c”再次解析IComponentContext,或解析基于Func的工厂以创建 来自的后续组件 下面是我的总结C# 抽象出Autofac';s工厂方法支持,c#,inversion-of-control,autofac,C#,Inversion Of Control,Autofac,提取Autofac工厂方法支持的正确方法是什么 我一直得到这样的例外: 此解析操作已结束。使用lambdas注册组件时, 无法存储lambda的IComponentContext“c”参数。相反,也不是 从“c”再次解析IComponentContext,或解析基于Func的工厂以创建 来自的后续组件 下面是我的总结 public void Register<T>(Func<IFactoryContext, T> factoryMethod) { _containe
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));
});
}
在使用容器时:
var foobar = container.Resolve<IFoo>();
var foobar=container.Resolve();
我想以下方法可行:
public void Register<T>(Func<IFactoryContext, T> factoryMethod)
{
_containerBuilder.Register<Func<Type, T>>(c =>
request => {
var ctx = c.Resolve<IComponentContext>();
factoryMethod(new AutofacFactoryContext(ctx));
});
}
公共无效寄存器(Func factoryMethod)
{
_containerBuilder.Register(c=>
请求=>{
var ctx=c.Resolve();
factoryMethod(新的AutoFactoryContext(ctx));
});
}
但是,请注意,这不会使用
请求
,就像您的第一个示例一样。因为我不确定您在这里想要实现什么,所以我无法提出更好的替代方案。我只是在学习如何抽象出autofac,这样我的项目就不必直接依赖它-它在另一个程序集中。@DanielA.White:通常,您应该只在您的合成根目录中使用DI容器。这是您的项目的一个非常受限的领域。切换DI容器只需要更改此约束区域。我不确定这是否值得努力。
var foobar = container.Resolve<IFoo>();
public void Register<T>(Func<IFactoryContext, T> factoryMethod)
{
_containerBuilder.Register<Func<Type, T>>(c =>
request => {
var ctx = c.Resolve<IComponentContext>();
factoryMethod(new AutofacFactoryContext(ctx));
});
}