自动FAC注册一般错误"sequence contains no element"



使用Autofac时,我尝试使用我的通用类型:

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    void Delete(Expression<Func<T, bool>> where);
    T GetById(long Id);
    T GetById(string Id);
    T Get(Expression<Func<T, bool>> where);
    IEnumerable<T> GetAll();
    IEnumerable<T> GetMany(Expression<Func<T, bool>> where);
}

注册我的泛型类:

 public abstract class RepositoryBase<T> where T : class
{
    private iMOSSContainer dataContext;
    private readonly IDbSet<T> dbset;
    protected RepositoryBase()
    {
        DatabaseFactory = new DatabaseFactory();
        dbset = DataContext.Set<T>();
    }
    protected RepositoryBase(IDatabaseFactory databaseFactory)
    {
        DatabaseFactory = databaseFactory;
        dbset = DataContext.Set<T>();
    }
    protected IDatabaseFactory DatabaseFactory
    {
        get;
        private set;
    }
    protected iMOSSContainer DataContext
    {
        get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
    }
    public virtual void Add(T entity)
    {
        dbset.Add(entity);
    }
    public virtual void Update(T entity)
    {
        dbset.Attach(entity);
        dataContext.Entry(entity).State = EntityState.Modified;
    }
    public virtual void Delete(T entity)
    {
        dbset.Remove(entity);
    }
    public virtual void Delete(Expression<Func<T, bool>> where)
    {
        IEnumerable<T> objects = dbset.Where<T>(where).AsEnumerable();
        foreach (T obj in objects)
            dbset.Remove(obj);
    }
    public virtual T GetById(long id)
    {
        return dbset.Find(id);
    }
    public virtual T GetById(string id)
    {
        return dbset.Find(id);
    }
    public virtual IEnumerable<T> GetAll()
    {
        return dbset.ToList();
    }
    public virtual IEnumerable<T> GetMany(Expression<Func<T, bool>> where)
    {
        return dbset.Where(where).ToList();
    }
    public T Get(Expression<Func<T, bool>> where)
    {
        return dbset.Where(where).FirstOrDefault<T>();
    }
}

这样写:

            var builder = new ContainerBuilder();
        builder.RegisterGeneric(typeof(RepositoryBase<>)).As(typeof(IRepository<>)); //.InstancePerLifetimeScope();
        Container = builder.Build();

并在构建容器时返回错误"sequence contains no element"。

我做了什么错误的代码?我已经试图寻找一个答案,但无济于事。因此,非常感谢您的帮助。

好的,然后我像这样改变RepositoryBase类:

public class RepositoryBase<T> : IRepository<T> where T : class
{
    private iMOSSContainer dataContext;
    private readonly IDbSet<T> dbset;
    public RepositoryBase()
    {
        DatabaseFactory = new DatabaseFactory();
        dbset = DataContext.Set<T>();
    }

:

  • 我使用"iRepository"接口(并移动"where T: class"语句(行尾)
  • 删除"抽象"类(因为它会导致另一个错误)
  • 将默认构造函数设置为"public"(因为它指向另一个)

现在一切都很顺利。

您的RepositoryBase类型是抽象的,因此无法注册。您需要注册非抽象类型。我猜你打算做的是注册RepositoryBase的所有子类型。

最新更新