【发布时间】:2017-05-29 12:44:36
【问题描述】:
所以,老实说,我什至不知道如何提出这个问题,因为我缺乏这方面的经验。如果缺少信息,请告诉我,我会补充所有信息。
我基本上是在尝试通过使用过滤器在我的 Web 应用程序中添加异常处理系统。
所以你可以在下面看到我创建的过滤器。在这里,我正在尝试访问我的工作单元,但在 container.Resolve<IUnitOfWork>(); 行上一直出现异常。
public class LogExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
var dependencyResolver = GlobalConfiguration.Configuration.DependencyResolver
as AutofacWebApiDependencyResolver;
var container = dependencyResolver.Container;
var uow = container.Resolve<IUnitOfWork>();
}
}
我得到的异常:
DependencyResolutionException 未被用户代码处理
'Autofac.Core.DependencyResolutionException' 类型的异常 发生在 Autofac.dll 中,但未在用户代码中处理附加信息:没有标签匹配的范围 'AutofacWebRequest' 在实例所在的范围内可见 被要求。这通常表明一个组件注册为 SingleInstance() 组件正在请求每个 HTTP 请求 (或类似的场景。)在 web 集成下总是请求 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime,从不来自容器 自己。
这里是 IUnitOfWork 接口:
public interface IUnitOfWork : IDisposable
{
IBoothRepository BoothRepository { get; }
IEventRepository EventRepository { get; }
ILocationRepository LocationRepository { get; }
IPersonRepository PersonRepository { get; }
IProfessionalRepository ProfessionalRepository { get; }
IRegistrationRepository RegistrationRepository { get; }
IStakeholderRepository StakeholderRepository { get; }
IStudentRepository StudentRepository { get; }
IVisitRepository VisitRepository { get; }
void SaveChanges();
DbContextTransaction BeginTransaction();
}
【问题讨论】:
-
我会重新审视你的 IUnitOfWork 接口......当然它不应该知道所有的存储库,而是你会有一个服务,它会知道存储库和工作单元,并使用它们来执行一个工作单元。在您当前的设计中,每次添加新存储库时都必须更改您的界面。这肯定是不正确的
-
如果您使用的是实体框架(或 LINQ),则数据上下文已经是工作单元模式的实现,因此您也不需要在更高级别重新执行此操作
标签: c# dependency-injection autofac unit-of-work