我有多个类型派生自同一个界面。我正在使用Unity IOC容器来注册类型
public interface IService
{
}
public class ServiceA : IService
{
}
public class ServiceB : IService
{
}
public class ServiceC : IService
{
}
如果我按以下方式注册这些类型
container.RegisterType<IService, ServiceA>("NameA");
container.RegisterType<IService, ServiceB>("NameB");
container.RegisterType<IService, ServiceC>("NameC");
然后我可以解决以下类型而没有任何问题。
var service = container.Resolve<IService>("NameA");
但是我得到了需要从外部注册容器的类型列表。 (从文本文件中假设)。所以我只需要注册提供列表中的那些类型。
public class Program
{
public static void Main()
{
// i will be getting this dictionary values from somewhere outside of application
// but for testing im putting it here
var list = new Dictionary<string, string>();
list.Add("NameA", "ServiceA");
list.Add("NameB", "ServiceB");
list.Add("NameC", "ServiceC");
var container = new UnityContainer();
var thisAssemebly = Assembly.GetExecutingAssembly();
//register types only that are in the dictionary
foreach (var item in list)
{
var t = thisAssemebly.ExportedTypes.First(x => x.Name == item.Value);
container.RegisterType(t, item.Key);
}
// try to resolve. I get error here
var service = container.Resolve<IService>("NameA");
}
}
我正在异常
未处理的类型异常 &#39; Microsoft.Practices.Unity.ResolutionFailedException&#39;发生在 Microsoft.Practices.Unity.dll
其他信息:依赖项的解析失败,type = &#34; ConsoleApplication1.IService&#34;,name =&#34; NameA&#34;。
在解析时发生异常。
异常是:InvalidOperationException - 当前类型, ConsoleApplication1.IService,是一个接口,不能 建造。你错过了类型映射吗?
在例外时,容器是:
解析ConsoleApplication1.IService,NameA
出于某些正当理由,我不想按惯例选项使用Unity的注册,或者使用Unity的配置文件选项来注册类型。我想根据我的清单注册它们。
答案 0 :(得分:0)
您忘了指定映射IYourInterface - &gt; YourClass
这有效:
std::istringstream
答案 1 :(得分:0)
您错误地使用了依赖注入。正确的方法是让控制器获取所需的依赖项,并留给依赖项注入框架注入具体实例。 查找更多信息here。
public class HomeController: Controller
{
private readonly ISettingsManager settingsManager;
public HomeController(ISettingsManager settingsManager)
{
this.settingsManager = settingsManager;
}
public ActionResult Index()
{
// you could use the this.settingsManager here
}
}