Kaj*_*sen 3 c# dependency-injection autofac asp.net-web-api
我正在尝试解决StartUp
ASP.Net WebApi 2项目的类中的依赖项.Autofac用于配置依赖注入.方案如下:
StuffFactory
和列表吧StuffModel
.现在的问题是所有这些都需要注册为InstancePerRequest
.抛出一个InvalidOperatonException
,这听起来很合理,因为请求生命周期范围无法访问StartUp
?
从请求实例的作用域中看不到具有匹配"AutofacWebRequest"的标记的作用域.这通常表示SingleInstance()组件(或类似场景)正在请求注册为每HTTP请求的组件.在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,从不从容器本身请求.
允许的东西在容器中注册的代码:
private IContainer RegisterAllowedStuff(IContainer container)
{
var builder = new ContainerBuilder();
builder.Register(x => GetAllowedStuffForUser(container))
.As<StuffModel>()
.InstancePerRequest();
builder.Update(container);
return container;
}
private static StuffModel GetAllowedStuffForUser(IContainer container)
{
var stuffFactory = container.Resolve<IStuffFactory>();
return stuffFactory.CreateStuffModel(Helper.GetParsedUserName());
}
Run Code Online (Sandbox Code Playgroud)
我有点被困在如何从这里前进.对于我完全监督的Autofac问题,是否有一个简单的解决方案?有人可能更清楚我是如何实现这一点的吗?提前致谢!
您的启动类中不应该有任何业务逻辑.Autofac允许您注册将在解析时调用的lambda方法.此时,a HttpRequest
可用,因此您可以将这些lambda注册为InstancePerRequest
.
在你的情况下,如果你想注册一个StuffModel
,InstancePerRequest
你可以这样做:
builder.RegisterType<ConcreteStuffFactory>()
.As<IStuffFactory>();
builder.Register(c => c.Resolve<IStuffFactory>()
.CreateStuffModel(Helper.GetParsedUserName()))
.As<IStuffModel>()
.InstancePerRequest();
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我也不会使用看起来像反模式的Helper类,例如,你可以创建一个服务来获取当前用户的用户名IUserContextProvider
.您还可以添加IUserContextProvider
依赖项ConcreteStuffFactory
public class ConcreteStuffFactory
{
public ConcreteStuffFactory(IUserContextProvider userContextProvider)
{
this._userContextProvider = userContextProvider;
}
private readonly IUserContextProvider _userContextProvider;
public IStuffModel CreateStuffModel()
{
String userName = this._userContextProvider.UserName;
// do things with userName
}
}
Run Code Online (Sandbox Code Playgroud)
和注册:
builder.RegisterType<ConcreteStuffFactory>()
.As<IStuffFactory>();
builder.RegisterType<HttpContextUserContextProvider>()
.As<IUserContextProvider>()
.InstancePerRequest();
builder.Register(c => c.Resolve<IStuffFactory>().CreateStuffModel())
.As<IStuffModel>()
.InstancePerRequest();
Run Code Online (Sandbox Code Playgroud)