【发布时间】:2013-08-16 02:13:24
【问题描述】:
我需要在 global.asax 中的应用程序启动时执行一些一次性代码。我已经启动并运行了 autofac 并进行了大量注册,但问题是我无法弄清楚如何解决或将依赖项注入到我 global.asax 中的 SecurityConfig.RegisterActivities() 中。
我尝试使用 autofac 容器自己手动解决 global.asax 中的依赖关系,但它引发了异常“在请求实例的范围内无法看到带有匹配 'AutofacWebRequest' 的标记的范围。强>”
如何将这种依赖项放入该类中?
protected void Application_Start()
{
var builder = new ContainerBuilder();
DependencyRegistrar dr = new DependencyRegistrar();
dr.Register(builder);
new SecurityConfig().RegisterActivities(); // this needs injecting into or resolving of IServiceManager instance
}
public class DependencyRegistrar
{
public virtual IContainer Register(ContainerBuilder builder)
{
builder.RegisterType<ServiceManager>().As<IServiceManager>().InstancePerHttpRequest();
builder.RegisterType<SecurityConfig>().AsSelf().PropertiesAutowired().InstancePerDependency();
}
}
public class SecurityConfig
{
public void RegisterActivities()
{
ServiceManager.DoSomething();
}
public IServiceManager ServiceManager { get; set; }
}
【问题讨论】:
-
为什么不能从容器中解析
SecurityConfig?为什么这个container.Resolve<SecurityConfig>().RegisterActivities();不起作用? -
这会引发错误:从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在由 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.
-
也就是说,有一个注册需要一个web请求,但是你没有在web请求的上下文中运行。尝试将操作包装在生命周期范围内。
标签: c# dependency-injection autofac