使用Unity解析类和接口的层次结构

时间:2016-10-26 20:18:45

标签: c# unity-container

(从记忆中写作)

尝试在SOL D中执行 I 。给定

public interface ISettingsReader
{
}

public interface ISettingsWriter : ISettingsReader
{
}

public class SettingsManager : ISettingsWriter
{
}

myContainer.RegisterType<ISettingsWriter, SettingsManager>();

为什么以下抱怨ISettingsReader无法解决:

public HomeController(ISettingsReader settingsReader)
{
}

我认为,因为我已将SettingsManager注册为ISettingsWriter,而ISettingsWriter继承ISettingsReader,所以Unity会足够聪明地确定{{1} }}也是SettingsManager

为什么我必须明确地做:

ISettingsReader

1 个答案:

答案 0 :(得分:3)

您需要显式注册两种基本类型的原因是Unity需要在解析ISettingsReader时具体了解您想要回复的内容。您正在寻找的案例是Unity之间不支持的接口之间的隐含转换。

作为隐式转换可能存在问题的一个例子,可能有许多不同的接口实现:

public class SettingsContainer : ISettingsReader { ... }
public class SettingsThing2 : ISettingsReader { ... }

您可以设置注册,以便IEnumerable<ISettingsReader>(或其他一些集合类型)自动解析为已注册的所有ISettingsReader实现。或者,您可能只需要一个ISettingsReader,Unity就不知道给您哪一个。我不是说这是好的设计,但考虑到C#语言的限制,它是可能的。

当您尝试解决时,Unity需要明确知道您想要的ISettingsReader实现。它不会尝试在接口之间进行转换。