【发布时间】:2017-01-24 23:16:34
【问题描述】:
我收到了一个 DependencyResolutionException 尝试使用 Autofac 的 parameterized instantiation 来解决 间接 依赖关系。
假设我有以下课程:
public interface IMuffin {}
public class Muffin : IMuffin
{
public Muffin(IButter butter) {}
}
public interface IButter {}
public class Butter : IButter
{
public Butter(IKnife knife) {}
}
public interface IKnife {}
现在假设我想要一个 IMuffin,但我想提供 IKnife 依赖项作为参数,如下所示:
public class Breakfast
{
public Breakfast(Func<IKnife, IMuffin> muffinFactory)
{
var muffin = muffinFactory(new Knife());
}
private class Knife : IKnife {}
}
问题是,我在muffinFactory(new Knife()) 上遇到异常,抱怨工厂无法使用可用参数和服务解决Butter 构造函数的IKnife 依赖项。这是没有意义的,因为我提供了一个 IKnife 的实例作为工厂的参数。
这似乎应该有效。我错过了什么?
【问题讨论】:
-
好的,我可以看到它们来自哪里,但是使用参数化实例化即使是 直接 依赖项也需要一些“知识”。只需一点点重构就可以将直接依赖关系转变为间接依赖关系。这实际上就是我的情况。使用上面的示例,假设
Muffin最初直接依赖于IKnife,那么Breakfast的参数化实例化将起作用。当Butter被分解时,IKnife变成了一个间接依赖,它破坏了Breakfast。IMuffin消费者不应该受到这种变化的影响。
标签: autofac