注册并解析一个Func<>与TinyIoc

时间:2018-02-09 15:06:54

标签: c# dependency-injection tinyioc

我正在尝试使用TinyIoc注册Func<string>

container.Register<Func<string>>(() => myObject.MyProperty); 

和一个依赖于构造函数的类型:

MyDependentType(Func<string> function)

当我使用

container.Resolve<MyDependentType>()

一切都很好,但我无法注册第二个Func<string>,因为它无法解决。我猜这是暧昧的。 没有抛出错误,但注入的Func是错误的。 我试图添加名字,但没有成功。

TinyIoc真的支持吗? 或者我必须将我的功能包装到对象中?像战略模式一样?

2 个答案:

答案 0 :(得分:1)

你是对的,不止一次映射同一类型是不明确的。没有DI容器可以处理这个问题,因为没有办法告诉另一个Func<string> Func<string>

那就是说,您的使用示例似乎非常不寻常。通常,如果您想要一个属性在另一个对象内,您可以注入该属性所属的对象,而不是Func<string>

class MyObject : IMyObject
{
    public string MyProperty { get { return "foo"; } }
}

class MyDependentType : IMyDependentType
{
    private readonly IMyObject myObject;

    public MyDependentType(IMyObject myObject)
    {
        this.myObject = myObject;
    }

    public void DoSomething()
    {
        var myProperty = this.myObject.MyProperty;
        // do something with myProperty...
    }
}

答案 1 :(得分:0)

像NightOwl888所说,那些Func&lt;&gt;对象含糊不清。 最后我用了一个工厂lambda。

container.Register<IMyType>((c, o) => {
    var dep = c.Resolve<IDependentType>();
    return new MyConcreteClass(() => dep.DependantFunc);
});

它有点多,但现在我可以让TinyIoc解决我的依赖关系了。 我只需要创建工厂lambda。