2014-07-17 69 views
2

我仍然努力爲asp mvc應用程序創建良好的數據訪問層,並且始終缺少某些內容:)
我已經爲DAL創建了單獨的程序集,並且正在使用存儲庫模式,爲國際奧委會注資。
問題是,現在我不知道如何編寫自定義方法(使用通用CRUD方法的方法)。
這是實現:
Context類:如何在使用通用存儲庫時編寫自定義方法

public class MainContext : IdentityDbContext<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>, IMainContext 
    { 
     public MainContext() 
      : base("DefaultConnection") 
     { 
     } 
     ... 
     public DbSet<Country> Countries { get; set; } 
     ... 
     public new IDbSet<TEntity> Set<TEntity>() where TEntity : class 
     { 
      return base.Set<TEntity>();    
     } 

庫:

public interface ICountryRepository : IGenericRepository<Country>... 

通用存儲庫:

public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class 
    { 
     private readonly IMainContext _context; 
     private readonly IDbSet<TEntity> _dbSet; 

     public GenericRepository(IMainContext context) 
     { 
      this._context = context; 
      this._dbSet = context.Set<TEntity>(); 
     } 
     ... 

通用倉庫接口:

public interface IGenericRepository<TEntity> where TEntity : class 
    { 
     IEnumerable<TEntity> Get(
      Expression<Func<TEntity, bool>> filter = null, 
      Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
      string includeProperties = ""); 

     TEntity GetByID(object id); 

     void Insert(TEntity entity); 

     void Delete(object id); 

     void Delete(TEntity entityToDelete); 

     void Update(TEntity entityToUpdate); 
    } 

這是嘗試在庫類中添加自定義的方法:

public virtual IEnumerable<Country> GetByLocation(float location) 
     { 
      var data = from c in _context... 
      return data; 
     } 

但我沒有背景。
我不知道如何實現獲取數據。
我應該注入它或通過new關鍵字實例(但我猜這是錯誤的)
如何現在實現自定義方法?

回答

3

ICountryRepository的實現應該繼承GenericRepository。 GenericRepository具有對可用於自定義查詢的數據庫上下文的引用。對於你的Generic Repository構造函數來說,如果你繼續通過你的圖層注入它,將更容易採用MainContext而不是IMainContext。有了Ninject,你會想要像這樣綁定你的MainContext:

kernel.Bind<MainContext>().ToSelf().InRequestScope(); 

和其他接口的具體實現。因此,您的每個存儲庫都將通過GenericRepository擁有上下文,該GenericRepository引用了您的數據庫上下文,您可以在存儲庫中自定義查詢。如果你有一個服務層,注入庫的接口:

private readonly ICountryRepository _repository; 

public SomeServie(ICountryRepository repository){ 
    _repository = repository; 
} 

public void DoSomething(float locationId){ 
    _repository.GetByLocation(locationId); 
} 

這裏是其它代碼,您需要:

public class CountryRepository : GenericRepository<Country>, ICountryRepository 
    { 

     public CountryRepository(MainContext mainContext) : base(mainContext) { } 

     public IEnumerable<Country> GetByLocation(float location) 
     { 
      return this.Context.Countries.ToList(); 
     } 

.....

public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class 
    { 
     public MainContext Context { get; set; } 
     public IDbSet<TEntity> DbSet { get; set; } 

     public GenericRepository(MainContext context) 
     { 
      Context = context; 
      DbSet = context.Set<TEntity>(); 
     } 

.. .....

此外,您的GetCountries不需要是虛擬的。 這裏的主要變化是你需要通過國家倉庫構造函數將上下文傳遞給base,並且上下文和國家db集需要公開,即使在繼承時也是如此。看到這篇文章:Are private members inherited in C#?

+0

是的我明白,這就是爲什麼'ICountry'繼承'GenericRepository',但是當我輸入this.'沒有上下文。 – 1110

+0

但是,當我將'private readonly _context'改爲'internal readonly _context'時,我在資源庫實現中看到它,但沒有DBSets了。 – 1110

+0

嘗試使它成爲DbSet 而不是IDbSet rleffler

相關問題