用Autofac注册特别封闭的泛型类型

本文关键字:泛型类型 Autofac 注册 | 更新日期: 2023-09-27 18:02:26

我有UnitofWork类,它实现了IUnitOfWork。我试着在autoface上注册:

var builder = new ContainerBuilder();
builder
    .RegisterGeneric(typeof(UnitOfWork<Repository<>,>))
    .As(typeof(IUnitOfWork))
    .InstancePerDependency();

实现:

public class UnitOfWork<T, O> : IUnitOfWork
    where T : Repository<O>
    where O : BaseEntity
{
}
public interface IUnitOfWork : IDisposable
{
    void SaveChanges();
}

给出错误"Type expected"

但是这个人在另一个项目上工作:

public class Repository<T> : GenericRepository<T> 
    where T : BaseEntity
{
    public Repository(IDbContext context) : base(context) { }   
}
public abstract class GenericRepository<T> 
    : IRepository<T>, IQueryable<T> where T : BaseEntity
{
}
builder
    .RegisterGeneric(typeof(Repository<>))
    .As(typeof(IRepository<>))
    .InstancePerHttpRequest();

用Autofac注册特别封闭的泛型类型

不能部分打开类(例如与UnitOfWork<Repository<>,>您指定了T但没有O) typeof 中,尝试使用:

var builder = new ContainerBuilder();
builder
    .RegisterGeneric(typeof(UnitOfWork<,>))
    .As(typeof(IUnitOfWork))
    .InstancePerDependency();

where T : Repository<O>泛型约束将确保第一个参数应该是Repository<>

但是它不能与RegisterGeneric一起工作,因为它需要一个通用的接口所以需要创建一个IUnitOfWork<T,O>

但是你的模型很奇怪。为什么UnitOfWork需要Repository<>类型参数?

不把它作为类型参数,你可以在UnitOfWork<E>构造函数中得到一个Repository<>:

public class UnitOfWork<E> : IUnitOfWork<E> where E : BaseEntity
{
    private readonly Repository<E> repository;
    public UnitOfWork(Repository<E> repository)
    {
        this.repository = repository;
    }
    //.. other methods
}

Where IUnitOfWork<E>

public interface IUnitOfWork<E> : IDisposable where E : BaseEntity
{
    void SaveChanges();
}

和Autofac注册:

var builder = new ContainerBuilder();
builder
    .RegisterGeneric(typeof(Repository<>)).AsSelf();
builder
    .RegisterGeneric(typeof(UnitOfWork<>))
    .As(typeof(IUnitOfWork<>))
    .InstancePerDependency();
var container = builder.Build();
// sample usage
var u = container.Resolve<IUnitOfWork<MyEntity>>();