AutoFac明确注册泛型类型

时间:2017-07-19 22:15:40

标签: c# generics autofac

如何告诉注册此通用存储库?每个请求都应将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;
    }
}

3 个答案:

答案 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(我会使用一个接口而不是对象)和你的数据库上下文。 然后你可以解决它。