(从记忆中写作)
尝试在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
答案 0 :(得分:3)
您需要显式注册两种基本类型的原因是Unity需要在解析ISettingsReader时具体了解您想要回复的内容。您正在寻找的案例是Unity之间不支持的接口之间的隐含转换。
作为隐式转换可能存在问题的一个例子,可能有许多不同的接口实现:
public class SettingsContainer : ISettingsReader { ... }
public class SettingsThing2 : ISettingsReader { ... }
您可以设置注册,以便IEnumerable<ISettingsReader>
(或其他一些集合类型)自动解析为已注册的所有ISettingsReader
实现。或者,您可能只需要一个ISettingsReader
,Unity就不知道给您哪一个。我不是说这是好的设计,但考虑到C#语言的限制,它是可能的。
当您尝试解决时,Unity需要明确知道您想要的ISettingsReader实现。它不会尝试在接口之间进行转换。