使用Autofac注册通用类型

时间:2013-03-05 14:38:03

标签: c# generics autofac unit-of-work

我有UnitofWork类,它实现了IUnitOfWork。我尝试用autofac注册:

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();
}

出现错误“预期类型”

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

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();

1 个答案:

答案 0 :(得分:55)

不能部分打开课程(例如UnitOfWork<Repository<>,>T而非Otypeof,请尝试:

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

where T : Repository<O>通用约束会考虑第一个参数应该是Repository<>

但它无法与RegisterGeneric一起使用,因为它需要通用界面,因此需要创建IUnitOfWork<T,O> ...

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

您可以在Repository<>构造函数中获得UnitOfWork<E>,而不是将其作为类型参数:

public class UnitOfWork<E> : IUnitOfWork<E> where E : BaseEntity
{
    private readonly Repository<E> repository;

    public UnitOfWork(Repository<E> repository)
    {
        this.repository = repository;
    }

    //.. other methods

}

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>>();