Autofac:基于单个依赖关系解析构造函数参数

时间:2014-08-26 00:53:03

标签: autofac

我有一个我希望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

的分辨率内逐个解析每个构造函数参数

2 个答案:

答案 0 :(得分:1)

不,这不起作用,因为您现在正在指示Autofac向NetworkCredential构造函数提供类型TopLevel的参数值,这显然需要两个完全不同类型的参数。

您必须先解析InnerType1InnerType2个实例,并将其提供给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);
        };
});