如何告诉注册此通用存储库?每个请求都应将ApplicationDbContext
作为TC
传递。
我尝试过这样的事情:
builder.RegisterGeneric(typeof(Repository<object, ApplicationDbContext>)).As(typeof(IRepository<>));
目前,我必须单独注册每一个有效但有点乏味的人:
builder.RegisterType<Repository<AudioModel, ApplicationDbContext>>().As<IRepository<AudioModel>>();
存储库:
public class Repository<T, TC> : IRepository<T>
where T : class
where TC : DbContext
{
private bool _disposed;
protected TC Context { get; }
public Repository()
{
}
public Repository(TC context)
{
Context = context;
}
}
服务:
public class UploadService : IUploadService
{
private readonly IRepository<AudioModel> _repository;
public UploadService(IRepository<AudioModel> repository)
{
_repository = repository;
}
}
答案 0 :(得分:0)
如果TC
始终设置为ApplicationDbContext
,则可能使TC
不是通用参数(它不需要是通用的,它总是相当的特异性的)。
如果这不是一个选项,您可以创建ApplicationDbContextRepository
:
public class ApplicationDbContext<T> : Repository<T, ApplicationDbContext>
{
}
并将此注册为:
builder.RegisterGeneric(typeof(ApplicationDbContext<>)
.As(typeof(IRepository<>));
但这取决于您的应用程序设计的其余部分。
答案 1 :(得分:0)
尝试以下操作:
builder
.RegisterGeneric(typeof(Repository<>)
.As(typeof(IRepository<,>));
Autofac将正确注册它,因为第一种类型在实现和接口上是相同的,对于第二种类型,它将仅选择任何将T作为第一种类型并将第二种作为第二种类型的IRepository接口。
答案 2 :(得分:-1)
您可以通过以下方式注册通用存储库:
builder.RegisterGeneric(typeof(Repository<>), typeof(IRepository<>));
你必须注册你的AudioModel(我会使用一个接口而不是对象)和你的数据库上下文。 然后你可以解决它。