2016-12-12 47 views
0

我通用倉庫接口:如何對我的背景下等待第二次手術前先用生活方式PerWebRequest完成對上下文和異步調用它

public interface IGenericRepository<T , TEntityKey> where T : EntityBase<TEntityKey> 
{ 
    IEnumerable<T> GetAll(); 
    IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate); 
    T FindBy(TEntityKey entityKey); 
    Task<T> FindByAsync(TEntityKey entityKey); 
    T Add(T entity); 
    T Delete(T entity); 
    void Edit(T entity); 
    void Save(); 
    void Dispose(); 
} 

我用await在執行我的庫中的所有異步方法。使用Castle Windsor作爲IOC容器的 ,我使用PerWebRequestLifeStyle安裝了我的環境。

客戶端發送兩個請求,並且每個請求映射到由IGenericRepository實現不同的存儲庫和此異常升高:在這種情況下開始

第二操作的先前的異步操作完成之前。在調用此上下文中的另一個方法之前,請使用'await'來確保任何異步操作已完成。任何實例成員不保證是線程安全的。

我改變了上下文的生活方式爲瞬態,但仍然異常上升。 任何人都可以幫助我哪裏錯了嗎?

GenericRepository實現:

public abstract class GenericRepository<T, TEntityKey> : IGenericRepository<T, TEntityKey> 
    where T : EntityBase<TEntityKey> 
{ 
    protected IDbContext _entities; 
    protected readonly IDbSet<T> _dbset; 

    protected GenericRepository(IDbContext context) 
    { 
     _entities = context; 
     _dbset = _entities.Set<T>(); 
    } 

    ~GenericRepository() 
    { 
     _entities.Dispose(); 
    } 

    public virtual IEnumerable<T> GetAll() 
    { 
     return _dbset.AsEnumerable<T>(); 
    } 

    public IEnumerable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate) 
    { 

     IEnumerable<T> query = _dbset.Where(predicate).AsEnumerable(); 
     return query; 
    } 

    public T FindBy(TEntityKey entityKey) 
    { 
     var result = _dbset.SingleOrDefault(e => e.Id.ToString() == entityKey.ToString()); 
     return result; 
    } 

    public Task<T> FindByAsync(TEntityKey entityKey) 
    { 
     var result = _dbset.SingleOrDefaultAsync(e => e.Id.ToString() == entityKey.ToString()); 
     return result; 
    } 

    public virtual T Add(T entity) 
    { 
     return _dbset.Add(entity); 
    } 

    public virtual T Delete(T entity) 
    { 
     return _dbset.Remove(entity); 
    } 

    public virtual void Edit(T entity) 
    { 
     _entities.Entry(entity).State = EntityState.Modified; 
    } 

    public virtual void Save() 
    { 
     _entities.SaveChanges(); 
    } 

    public async Task SaveAsync() 
    { 
     await _entities.SaveChangesAsync(); 
    } 

    public void Dispose() 
    { 
     if (_entities != null) 
     { 
      _entities.Dispose(); 
      _entities = null; 
      GC.SuppressFinalize(this); 
     } 
    } 
} 
+0

請加'GenericRepository'實現類的代碼)。 –

回答

0

我覺得你有一些遺傳資源庫這樣的:

Public Repository1<Class1, KeyClass1> : GenericRepository<T, TEntityKey> 
{ 
    Public Repository1(IDbContext c) : base(c) { } 
} 

Public Repository2<Class2, KeyClass2> : GenericRepository<T, TEntityKey> 
{ 
    Public Repository2(IDbContext c) : base(c) { } 
} 

這意味着你的溫莎城堡將爲IDbContext創建一個實例,並將其注入到兩個庫,導致你的錯誤。

我可以建議你到你的基類改成這樣:

public abstract class GenericRepository<T, TEntityKey> : IGenericRepository<T, TEntityKey> 
    where T : EntityBase<TEntityKey> 
{ 
    protected IDbContext _entities; 
    protected readonly IDbSet<T> _dbset; 

    protected GenericRepository() 
    { 
     _entities = new MyDbContext(); 
     _dbset = _entities.Set<T>(); 
    } 

    ... 
} 
相關問題