【发布时间】:2018-11-12 06:07:58
【问题描述】:
我正在尝试使用 Autofac、EF Core 和 AutoMapper 设置我的 ASP.NET Core Web API 项目强>。
目前我可以让我的项目使用以下两种设置:
- 将所有内容注册为单例 =>
SingleInstance()(EF 上下文存在并发问题,因为它不是线程安全的) - 注册所有内容,以便每次调用
Resolve()时都会获得一个新实例 =>InstancePerDependency()(额外开销)
很遗憾,我无法使其与 InstancePerRequest() 范围一起使用。
由于某种原因,我收到以下错误消息:
这听起来有点像我会在 singelton 服务的某个地方注入那些 InstancePerRequest() 依赖项......
一旦我将所有内容更改为SingleInstance() 或InstancePerDependency(),一切正常。与InstancePerRequest()相比,至少不计算并发问题和额外开销。
Startup.cs
/// <summary>
/// Is called by the ASP.NET Core application for all environments.
/// </summary>
/// <param name="builder">Builder container.</param>
private static void ConfigureContainer(ContainerBuilder builder, ApplicationName applicationName)
{
// For all environments and for only user service specific registrations
if (applicationName == ApplicationName.XY)
{
// Auto mapper
builder.RegisterAutoMapper();
// Register db context
builder.RegisterType<MyDbContext>().InstancePerRequest();
// Repositories
builder.RegisterType<RepositoryA>().As<IRepositoryA>().InstancePerRequest();
// Services
builder.RegisterType<ServiceA>().As<IServiceA>().InstancePerRequest();
}
}
/// <summary>
/// Register AutoMapper to the DI container.
/// </summary>
public static void RegisterAutoMapper(this ContainerBuilder builder)
{
builder.Register(c => new MapperConfiguration(cfg =>
{
// Mapping
cfg.CreateMap<EntityA, EntityB>();
})).AsSelf().SingleInstance();
// Register mapper
builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();
}
服务 A
public class ServiceA : IServiceA
{
private readonly IMapper _mapper;
private readonly IRepositoryA _repository;
public ServiceA (IRepositoryA _repository, IMapper mapper)
{
_repository = _repository;
_mapper = mapper;
}
/// <summary>
/// Return all categories.
/// </summary>
public async Task<List<XY>> GetAllAsync()
{
return await _repository.XY.ToListAsync();
}
}
存储库 A
public class RepositoryA : RepositoryBase<XY, int, RepositoryA>, IRepositoryA
{
public RepositoryA(MyDbContext myDbContext, ILogger<RepositoryA> logger) : base(myDbContext, logger)
{
}
}
}
RepositoryBase
public abstract class RepositoryBase<TEntityType, TIdType, TLoggingType>
where TEntityType : class
where TLoggingType : class
{
private readonly MyDbContext _myDbContext;
protected readonly ILogger<TLoggingType> _logger;
protected DbSet<TEntityType> _dbSet;
private bool _disposed = false;
public RepositoryBase(MyDbContext myDbContext, ILogger<TLoggingType> logger)
{
_myDbContext = myDbContext;
_dbSet = _myDbContext.Set<TEntityType>();
_logger = logger;
}
// All the boilerplate code has been left out for the sake of brevity
}
【问题讨论】:
标签: .net entity-framework asp.net-web-api dependency-injection autofac