我有一个ASP.NET MVC 5应用程序,我使用Structuremap 3作为IOC。
我有一个通过N层使用多种类型的接口,我找不到如何将多个类型映射到同一接口以进行自动构造函数注入的简洁说明。
例如,我在我的注册表中有以下声明
For<IDataContextAsync>().Use<DbGeoContext>();
For<IDataContextAsync>().Use<DbEspContext>();
当我运行我的应用程序时,我理解最后添加的IDataContextAsync实例将是我的应用程序在构造函数中创建需要IDataContextAsync作为参数的类型实例时使用的默认实例。
所以我的问题是如何告诉Structuremap 3在注册表中使用与正在创建的类型相关的IDataContextAsync的特定实例?
感谢。
答案 0 :(得分:0)
为了区分不同的实现,您可以使用命名实例(请参阅文档here)。您注册这样的命名实例:
//Default instance
For<IDataContextAsync>().Use<DbGeoContext>();
For<IDataContextAsync>().Add<DbEspContext>().Named("EspContext");
请注意,Add
方法注册实例而不将其设置为默认值,而Use
方法将其注册为默认实例。正如您已经意识到的那样,使用Use
方法注册的最后一个实例将成为默认实例。
为了告诉dependee应该将哪个实例传递给构造函数,可以使用Ctor
指令来指定构造函数参数(请参阅文档here):
For<IMyRepository>().Use<MyRepository>()
.Ctor<IDataContextAsync>().Named("EspContext");
这是一个容易混淆的简写:
For<IMyRepository>().Use<MyRepository>()
.Ctor<IDataContextAsync>()
.Is(c => c.GetInstance<IDataContextAsync>("EspContext"));
或者,您可以跳过命名参数magic并直接使用以下内容获取具体类型:
For<IMyRepository>().Use<MyRepository>()
.Ctor<IDataContextAsync>().Is<DbEspContext>();