您可以轻松地通过使用StructureMap的IContext访问请求的类型。
ObjectFactory.Configure(
x => {
x.For<ILogger>().Use(context => new TestLogger(context.ParentType));
});
在上述语句中,context.ParentType返回由StructureMap创建的类型。
杰里米米勒在博客文章中也介绍了这个话题。本文使用过时的语法,但它仍然是相关的:http://codebetter.com/jeremymiller/2009/01/15/using-the-build-session-in-structuremap/
如果您想检查所有在IContext可用的属性,你可以使用匿名函数,并设置一个断点在回行,像这样:
ObjectFactory.Configure(
x => {
x.For<ILogger>()
.Use(context =>
{
// Set breakpoint here and inspect the context
return new TestLogger(context.ParentType);
});
});
更新:
确保使用.AlwaysUnique()(这相当于.CacheBy的较旧的语法(InstanceScope.Unique)),否则将StructureMap缓存ILogger的第一次请求这将导致原来的记录器bein g在单个GetInstance()调用期间被注入到ILogger的所有后续请求中。
如果已经嵌套在每个需要ILogger所以对于ObjectFactory.GetInstance < ISomeClass>(一个请求类)这可以容易地发生将导致ILogger被用于在层次结构中的最深的类创建,然后所有其他类将收到相同的ILogger实例,这很可能是你要做的不是想要发生。
因此,采取这种更新和Ben的小费考虑,这里有一个更好的解决方案:
x.For<ILogger>()
.AlwaysUnique()
.Use(c => new TestLogger(c.ParentType ?? c.BuildStack.Current.ConcreteType));
谢谢,解决了这一段时间后,但忘了我曾问过。我发现'ctx.ParentType'有时返回null,所以做到以下几点:'对于()。使用(ctx => new TestLogger(ctx.ParentType ?? ctx.BuildStack.Current.ConcreteType));' –
2012-07-24 09:43:41
@BenFoster谢谢为小费。经过测试,我确实看到了这种情况。另外,我注意到StructureMap没有为ObjectFactory.GetInstance()的一次调用的层次结构中需要的每个ILogger获取一个新的ILogger,所以在查看了一下后,我发现使用.AlwaysUnique()方法可以删除所有的缓存行为并给出期望的结果。我已经更新了我的答案,以反映我的发现和提示。谢谢。 – 2012-07-24 18:25:09