在StructureMap 3中获取容器

时间:2015-02-18 17:41:11

标签: structuremap

我正在尝试获取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));

但是这也返回一个空值。

1 个答案:

答案 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