【发布时间】:2016-09-26 08:26:24
【问题描述】:
我正在尝试解决 ASP.Net WebApi 2 项目的 StartUp 类中的依赖关系。 Autofac 用于配置依赖注入。场景如下:
- 不同的用户看到不同的数据。每个用户都有特定的权限,允许该用户查看特定的数据。
- 正在使用包含多个边界的域驱动架构。不允许在域和数据访问层进行跨界调用。这一点很重要,因为为了获取用户允许数据的所有代码,我们需要做一些跨界调用。
- 我们希望过滤数据访问层内的数据,只为每个用户检索允许的数据。此处不允许跨境通话。
- 为了实现这一点,我想从用户可以看到的记录中注入所有代码的列表。
- 为此,我尝试向 Autofac 注册一个工厂,它会根据用户创建此列表。我们将工厂称为
StuffFactory,将列表称为StuffModel。
现在的问题是所有这些都需要注册为InstancePerRequest。这会抛出一个InvalidOperatonException,这听起来很合理,因为在StartUp 中无法访问请求生命周期范围?
从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在由 SingleInstance() 组件(或类似场景)请求。在 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());
}
我有点纠结于如何从这里前进。对于我完全监督的 Autofac 问题,是否有一个简单的解决方案?有人可能对我如何实现这一点有更好的了解吗?提前致谢!
【问题讨论】:
标签: c# asp.net-web-api dependency-injection autofac