在 StructureMap 3 中获取容器
Get container in StructureMap 3
我正在尝试获取 StructureMap 3 当前容器如下:
public HomeController(IContainer injectedContainer) {
IContainer container = new Container();
var test1 = container.GetAllInstances(typeof(IMediator));
var test2 = injectedContainer.GetAllInstances(typeof(IMediator));
}
test1 returns 没有... test2 returns 一个中介实例。
所以我的 StructureMap 3 配置工作正常,但在我的应用程序的某些地方我需要手动获取容器。我该怎么做?
我尝试了以下方法:
var test3 = ObjectFactory.Container.GetAllInstances(typeof(IMediator));
但是这个returns也是一个空值。
您在示例中所做的只是创建一个空容器,这就是没有返回任何内容的原因。您可以通过在您的容器上调用 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, or this Nuget package that uses the same approach)。
如果您需要手动访问容器,然后使用这种方法,您可以从 HttpContext.Items
中提取子容器的实例,该实例在请求结束时被处理掉。
另一种选择是创建您自己的 ObjectFactory
实例,例如 this example。
我正在尝试获取 StructureMap 3 当前容器如下:
public HomeController(IContainer injectedContainer) {
IContainer container = new Container();
var test1 = container.GetAllInstances(typeof(IMediator));
var test2 = injectedContainer.GetAllInstances(typeof(IMediator));
}
test1 returns 没有... test2 returns 一个中介实例。
所以我的 StructureMap 3 配置工作正常,但在我的应用程序的某些地方我需要手动获取容器。我该怎么做?
我尝试了以下方法:
var test3 = ObjectFactory.Container.GetAllInstances(typeof(IMediator));
但是这个returns也是一个空值。
您在示例中所做的只是创建一个空容器,这就是没有返回任何内容的原因。您可以通过在您的容器上调用 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, or this Nuget package that uses the same approach)。
如果您需要手动访问容器,然后使用这种方法,您可以从 HttpContext.Items
中提取子容器的实例,该实例在请求结束时被处理掉。
另一种选择是创建您自己的 ObjectFactory
实例,例如 this example。