我正在尝试获取StructureMap 3当前容器如下:
public HomeController(IContainer injectedContainer) {
IContainer container = new Container();
var test1 = container.GetAllInstances(typeof(IMediator));
var test2 = injectedContainer.GetAllInstances(typeof(IMediator));
}
test1什么都不返回... test2返回一个中介实例。
所以我的StructureMap 3配置工作正常,但在我的应用程序的某些地方我需要手动获取容器。我怎么能这样做?
我尝试了以下内容:
var test3 = ObjectFactory.Container.GetAllInstances(typeof(IMediator));
但是这也返回一个空值。
答案 0 :(得分:4)
您在示例中所做的只是创建一个空容器,这就是为什么没有返回任何内容。您可以通过调用容器上的container.WhatDoIHave();
来查看此内容。
首先,您必须像这样配置容器:
IContainer container = new Container();
container.Configure(c =>
{
c.IncludeRegistry<WebsiteRegistry>();
});
WebsiteRegistry.cs
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
this.Scan(x =>
{
x.TheCallingAssembly();
x.WithDefaultConventions();
});
}
}
然后您就可以在ObjectFactory
内访问您的实例了。但是,您可能已经注意到ObjectFactory
在将来的StructureMap版本中被标记为删除,因此您可以选择一些选项。
如果您正在使用ASP.NET MVC,则常见的建议是使用绑定到Web应用程序HTTP上下文的子容器(请参阅this tutorial for how it can be done或此Nuget package that uses the same approach)。
如果您需要手动访问容器,那么使用此方法,您可以从HttpContext.Items
中提取子容器的实例,该实例在请求结束时被处理掉。
另一种选择是查看创建自己的ObjectFactory
实例,例如this example。