C# Structuremap 3单接口多类型

C# Structuremap 3单接口多类型,c#,asp.net-mvc,structuremap,structuremap3,C#,Asp.net Mvc,Structuremap,Structuremap3,我有一个ASP.NET MVC 5应用程序,我使用Structuremap 3作为IOC 我有一个通过N层在多个类型中使用的接口,我找不到一个简洁的解释,说明如何将多个类型映射到同一个接口以进行自动构造函数注入 例如,我的注册表中有以下声明 For<IDataContextAsync>().Use<DbGeoContext>(); For<IDataContextAsync>().Use<DbEspContext>(); For().Use(

我有一个ASP.NET MVC 5应用程序,我使用Structuremap 3作为IOC

我有一个通过N层在多个类型中使用的接口,我找不到一个简洁的解释,说明如何将多个类型映射到同一个接口以进行自动构造函数注入

例如,我的注册表中有以下声明

For<IDataContextAsync>().Use<DbGeoContext>();  
For<IDataContextAsync>().Use<DbEspContext>();
For().Use();
For().Use();
当我运行我的应用程序时,我知道最后添加的IDataContextAsync实例将是我的应用程序创建需要IDataContextAsync作为构造函数参数的类型的实例时使用的默认实例

因此,我的问题是如何告诉Structuremap 3在注册表中使用与所创建类型相关的IDataContextAsync的特定实例


谢谢

为了区分不同的实现,可以使用命名实例(参见文档)。您可以按如下方式注册命名实例:

//Default instance
For<IDataContextAsync>().Use<DbGeoContext>();  
For<IDataContextAsync>().Add<DbEspContext>().Named("EspContext");
这是一个名称混乱的缩写:

For<IMyRepository>().Use<MyRepository>()
    .Ctor<IDataContextAsync>()
    .Is(c => c.GetInstance<IDataContextAsync>("EspContext"));
For()。使用()
.Ctor()
.Is(c=>c.GetInstance(“EspContext”);
或者,您可以跳过命名参数魔术,直接使用以下命令选择具体类型:

For<IMyRepository>().Use<MyRepository>()
    .Ctor<IDataContextAsync>().Is<DbEspContext>();
For()。使用()
.Ctor().Is();

您好,谢谢您的回复,我终于想出来了,但花了我一段时间。我会标记你的答案,但我还没有足够的分数。事实上,我发现了一个问题,在应用程序启动时,我检索了EspContext的实例并更新了它的连接字符串,但是当我将请求跟踪到存储库层时,连接字符串没有改变?隐马尔可夫模型。。。除了GetInstance之外,还有其他方法可以做同样的事情,但不创建实例吗?从一开始就将连接字符串设置为正确的值不是更容易吗?如果直到应用程序生命周期中的某个特定时间点才知道该值,请使用工厂模式并注入可以生成连接的工厂,而不是注入实际连接。我认为您的问题在于,存储库中的实例与您更改的实例不同。可以在structuremap中为每种类型设置。默认值为瞬态(每个对象的新对象图)。您好,谢谢您的回复,绘图变厚了。。我使用了For().Use().Ctor().Is();方法,但是注入了错误的DbContext,您能否提供一个示例来说明此方法使用2个DbContext?谢谢。我用Structuremap v2、3和4成功地运行了它。
For<IMyRepository>().Use<MyRepository>()
    .Ctor<IDataContextAsync>().Is<DbEspContext>();