我有一个我希望autofac解决的方案:
这是我的类,我将有一个工厂方法来获取NetworkCredentials并返回TopLevel对象,这应该在内部使用NetwokCredentials解析InnerType1和InnerType2
public class TopLevel
{
public TopLevel(InnerType1 type1, InnerType2 type2)
{
}
}
public class InnerType1
{
public InnerType1(NetworkCredential credential)
{
}
}
public class InnerType2
{
public InnerType2(NetworkCredential credential)
{
}
}
注册码>会有类似的工作吗?
builder.Register<Func<NetworkCredential, TopLevel>>(c =>
{
var context = c.Resolve<IComponentContext>();
return (cred) => context.Resolve<TopLevel>(new TypedParameter(typeof(NetworkCredential), cred));
});
原始方法可能是在TopLevel
的分辨率内逐个解析每个构造函数参数答案 0 :(得分:1)
不,这不起作用,因为您现在正在指示Autofac向NetworkCredential
构造函数提供类型TopLevel
的参数值,这显然需要两个完全不同类型的参数。
您必须先解析InnerType1
和InnerType2
个实例,并将其提供给TopLevel
解决方案。像这样:
builder.Register<Func<NetworkCredential, TopLevel>>(c =>
{
var context = c.Resolve<IComponentContext>();
return (cred) => {
var i1 = context.Resolve<InnerType1>(TypedParameter.From(cred));
var i2 = context.Resolve<InnerType2>(TypedParameter.From(cred));
return context.Resolve<TopLevel>(TypedParameter.From(i1), TypedParameter.From(i2));
};
});
注意:我没有在这里看到你系统的全貌,但如果你觉得这很粗糙,也许你应该考虑修改你的类层次结构。 IMO在你的代码中有一种“过于复杂”的微弱气味,你需要使用相同的数据配置两个不同的类,这使得我想要去复制:)
答案 1 :(得分:0)
与彼得的答案相似,但味道略有不同:
builder.Register<Func<NetworkCredential, TopLevel>>(c =>
{
var resolveInnerType1 = c.Resolve<Func<NetworkCredential, InnerType1>>();
var resolveInnerType2 = c.Resolve<Func<NetworkCredential, InnerType2>>();
var resolveTopLevel = c.Resolve<Func<InnerType1, InnerType2, TopLevel>>();
return (cred) => {
var i1 = resolveInnerType1(cred);
var i2 = resolveInnerType2(cred);
return resolveTopLevel(i1, i2);
};
});