使用 TinyIoc 注册并解析 Func<>
Register and Resolve a Func<> with TinyIoc
我正在尝试使用 TinyIoc 注册一个 Func<string>
。:
container.Register<Func<string>>(() => myObject.MyProperty);
和一个依赖于它的构造函数的类型:
MyDependentType(Func<string> function)
当我使用
container.Resolve<MyDependentType>()
一切都很好,但是我无法注册第二个Func<string>
,因为它无法解决。我猜这是模棱两可的。
没有抛出错误,但是注入的 Func 是错误的。
我尝试添加名称,但没有成功。
TinyIoc 真的支持吗?
或者我是否必须将函数包装到对象中?喜欢策略模式?
你是对的,多次映射同一个类型是有歧义的。没有 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...
}
}
正如 NightOwl888 所说,那些 Func<> 对象是不明确的。
最后我用了工厂lambda。
container.Register<IMyType>((c, o) => {
var dep = c.Resolve<IDependentType>();
return new MyConcreteClass(() => dep.DependantFunc);
});
有点多,不过现在我可以让TinyIoc解决我的依赖了。
我只需要创建工厂 lambda。
我正在尝试使用 TinyIoc 注册一个 Func<string>
。:
container.Register<Func<string>>(() => myObject.MyProperty);
和一个依赖于它的构造函数的类型:
MyDependentType(Func<string> function)
当我使用
container.Resolve<MyDependentType>()
一切都很好,但是我无法注册第二个Func<string>
,因为它无法解决。我猜这是模棱两可的。
没有抛出错误,但是注入的 Func 是错误的。
我尝试添加名称,但没有成功。
TinyIoc 真的支持吗? 或者我是否必须将函数包装到对象中?喜欢策略模式?
你是对的,多次映射同一个类型是有歧义的。没有 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...
}
}
正如 NightOwl888 所说,那些 Func<> 对象是不明确的。 最后我用了工厂lambda。
container.Register<IMyType>((c, o) => {
var dep = c.Resolve<IDependentType>();
return new MyConcreteClass(() => dep.DependantFunc);
});
有点多,不过现在我可以让TinyIoc解决我的依赖了。 我只需要创建工厂 lambda。