使用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 : Repositorygenerics约束将处理第一个参数应该是一个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>();