使用Autofac注册通用类型
我有UnitofWork类,它实现了IUnitOfWork。 我试着用autofac注册:
var builder = new ContainerBuilder(); builder .RegisterGeneric(typeof(UnitOfWork<Repository,>)) .As(typeof(IUnitOfWork)) .InstancePerDependency();
实施是:
public class UnitOfWork : IUnitOfWork where T : Repository where O : BaseEntity { } public interface IUnitOfWork : IDisposable { void SaveChanges(); }
给出“预期类型”错误
但是这个工作在另一个项目上:
public class Repository : GenericRepository where T : BaseEntity { public Repository(IDbContext context) : base(context) { } } public abstract class GenericRepository : IRepository, IQueryable where T : BaseEntity { } builder .RegisterGeneric(typeof(Repository)) .As(typeof(IRepository)) .InstancePerHttpRequest();
您不能 在typeof
部分打开类 (例如,使用UnitOfWork
您已指定T
而不是O
),请尝试使用:
var builder = new ContainerBuilder(); builder .RegisterGeneric(typeof(UnitOfWork<,>)) .As(typeof(IUnitOfWork)) .InstancePerDependency();
where T : Repository
generics约束将处理第一个参数应该是一个Repository<>
但它不适用于RegisterGeneric
因为它需要通用接口,因此需要创建一个IUnitOfWork
…
但你的模型很奇怪。 为什么UnitOfWork
需要Repository<>
类型参数?
您可以在UnitOfWork
构造函数中获取Repository<>
,而不是将其作为类型参数:
public class UnitOfWork : IUnitOfWork where E : BaseEntity { private readonly Repository repository; public UnitOfWork(Repository repository) { this.repository = repository; } //.. other methods }
IUnitOfWork
public interface IUnitOfWork : 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>();