用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();
您不能部分打开类(例如与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>>();