我这样做: https://stackoverflow.com/questions/12069002/autofac-resolve-with-and-without-named-parameter
我注册了一个界面。对于初始化,需要参数。 第一个调用将传递此参数。
在另一个地方,我也想解决这个接口的实例,但我不能传递这个参数。 是否可以检查此接口是否已解析(在当前范围内。我使用ASP.NET WEB API)? 如果我在没有参数的情况下解决它,我会得到一个例外。
我需要检查当前的HttpRequest-scope是否已经解析(所以我可以在不传递参数的情况下得到它,因为如果它已经解析,那么注册的creation-delegate将不会被调用两次)
m_builder.Register<IMyClass((c, p) =>
{
//...
return new MyClass;
}).InstancePerHttpRequest();//.InstancePerApiRequest();
答案 0 :(得分:4)
首先,创建一个可以跟踪实例是否已解析的类:
public class Tracker
{
public bool IsResolved { get; set; }
}
(你可能希望对此有所了解:))
使用与您想要跟踪的内容相同的范围注册它:
builder.RegisterType<Tracker>()
.InstancePerHttpRequest();
然后,在OnActivated
事件中,设置bool:
builder.Register((c, p) => {
return new MyClass();
})
.As<IMyClass>()
.InstancePerHttpRequest()
.OnActivated(e => {
e.Context.Resolve<Tracker>().IsResolved = true;
});
您也可以在激活期间(在第一个委托中)设置字段,但如果您愿意,可以使用OnActivated
事件更容易概括。
最后,检查字段:
if (container.Resolve<Tracker>().IsResolved) { ... }