国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

asp.net core 實現一個簡單的倉儲的方法

來源:懂視網 責編:小采 時間:2020-11-27 22:35:14
文檔

asp.net core 實現一個簡單的倉儲的方法

asp.net core 實現一個簡單的倉儲的方法:一直有自己寫個框架的想法,但是一直沒有行動起來,最近比較閑,正好可以開工了. 現在已經完成了兩部分.1.一個簡單倉儲,實現使用的是ef 2.IOC部分,這里是把內置的ioc替換成了aotofac,這部分感覺還是有一點缺陷的.下面說 倉儲部分 這里主要是接口是實現,目前使
推薦度:
導讀asp.net core 實現一個簡單的倉儲的方法:一直有自己寫個框架的想法,但是一直沒有行動起來,最近比較閑,正好可以開工了. 現在已經完成了兩部分.1.一個簡單倉儲,實現使用的是ef 2.IOC部分,這里是把內置的ioc替換成了aotofac,這部分感覺還是有一點缺陷的.下面說 倉儲部分 這里主要是接口是實現,目前使

一直有自己寫個框架的想法,但是一直沒有行動起來,最近比較閑,正好可以開工了.

現在已經完成了兩部分.1.一個簡單倉儲,實現使用的是ef 2.IOC部分,這里是把內置的ioc替換成了aotofac,這部分感覺還是有一點缺陷的.下面說

倉儲部分

這里主要是接口是實現,目前使用ef實現了倉儲的接口.看一下代碼

 public interface IRepository<TEntity, TPrimaryKey>
 where TEntity : class
 {
 #region Select/Get/Query

 IQueryable<TEntity> GetAll();

 IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] propertySelectors);

 List<TEntity> GetAllList();

 Task<List<TEntity>> GetAllListAsync();

 List<TEntity> GetAllList(Expression<Func<TEntity, bool>> predicate);

 Task<List<TEntity>> GetAllListAsync(Expression<Func<TEntity, bool>> predicate);

 T Query<T>(Func<IQueryable<TEntity>, T> queryMethod);

 TEntity Get(TPrimaryKey id);

 Task<TEntity> GetAsync(TPrimaryKey id);

 TEntity Single(Expression<Func<TEntity, bool>> predicate);

 Task<TEntity> SingleAsync(Expression<Func<TEntity, bool>> predicate);

 TEntity FirstOrDefault(TPrimaryKey id);

 Task<TEntity> FirstOrDefaultAsync(TPrimaryKey id);

 TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate);

 Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate);

 TEntity Load(TPrimaryKey id);

 #endregion

 #region Insert

 TEntity Insert(TEntity entity);

 Task<TEntity> InsertAsync(TEntity entity);

 #endregion

 #region Update

 TEntity Update(TEntity entity);

 Task<TEntity> UpdateAsync(TEntity entity);

 TEntity Update(TPrimaryKey id, Action<TEntity> updateAction);

 Task<TEntity> UpdateAsync(TPrimaryKey id, Func<TEntity, Task> updateAction);

 #endregion

 #region Delete

 void Delete(TEntity entity);

 Task DeleteAsync(TEntity entity);

 void Delete(TPrimaryKey id);

 Task DeleteAsync(TPrimaryKey id);

 void Delete(Expression<Func<TEntity, bool>> predicate);

 Task DeleteAsync(Expression<Func<TEntity, bool>> predicate);

 #endregion

 #region Aggregates

 int Count();

 Task<int> CountAsync();

 int Count(Expression<Func<TEntity, bool>> predicate);

 Task<int> CountAsync(Expression<Func<TEntity, bool>> predicate);

 long LongCount();

 Task<long> LongCountAsync();

 long LongCount(Expression<Func<TEntity, bool>> predicate);

 Task<long> LongCountAsync(Expression<Func<TEntity, bool>> predicate);

 #endregion
 }

下面是實現的部分代碼,代碼比較占版面,就不貼全了.

 public abstract class RepositoryBase<TEntity, TPrimaryKey> : IRepository<TEntity, TPrimaryKey>
 where TEntity : class
 {
 public abstract IQueryable<TEntity> GetAll();

 public abstract IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] propertySelectors);

 public virtual List<TEntity> GetAllList()
 {
 return GetAll().ToList();
 }

 public virtual async Task<List<TEntity>> GetAllListAsync()
 {
 return await Task.FromResult(GetAllList());
 }
 }
 public class EfRepositoryBase<TDbContext, TEntity, TPrimaryKey> : RepositoryBase<TEntity, TPrimaryKey>
 where TEntity : class
 where TDbContext : DbContext
 {
 public virtual TDbContext Context { private set; get; }

 public virtual DbSet<TEntity> Table => Context.Set<TEntity>();

 public EfRepositoryBase(TDbContext context)
 {
 Context = context;
 }

 public override IQueryable<TEntity> GetAll()
 {
 return Table;
 }

 public override IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] propertySelectors)
 {
 if (propertySelectors == null)
 {
 return GetAll();
 }

 var linq = GetAll();

 foreach (var item in propertySelectors)
 {
 linq = linq.Include(item);
 }

 return linq;
 }
 }

注意看EfRepositoryBase繼承了RepositoryBase,而RepositoryBase實現了IRepository.這里的RepositoryBase是所有實現的基類.GetAllList虛方法直接調用了抽象方法GetAll,這樣在EfRepositoryBase中就可以減少很多代碼了.

這里有個坑 EfRepositoryBase 是不能直接注冊到IOC中的,因為EfRepositoryBase和IRepository的泛型參數個數不一致,ioc不能找到多出的一個泛型的值.使用倉儲的時候繼承EfRepositoryBase把dbcontext傳進去就好了

public class TestRepository<TEntity, TPrimaryKey> : EfRepositoryBase<TestContext, TEntity, TPrimaryKey> where TEntity : class
{
 public TestRepository(TestContext context)
 : base(context)
 {
 }
}

IOC部分

asp.net core 微軟提供了一個簡單的IOC,但是接口比較少,替換成我們熟悉的ioc框架就方便多了. asp.net core 也有很方便的替換ioc的方法.簡單說就是修改ConfigureServices方法的返回值為IServiceProvider.我使用了autofac,下面看代碼.

public IServiceProvider ConfigureServices(IServiceCollection services)
{
 services.AddMvc();

 return services.AddLuna<AutofacModule>();
}


public static IServiceProvider AddLuna<TModule>([NotNull]this IServiceCollection services)
 where TModule : IModule, new()
{
 var builder = new ContainerBuilder();
 builder.Populate(services);
 builder.RegisterModule<TModule>();

 return new AutofacServiceProvider(builder.Build());
}

public class AutofacModule : Module
{
 protected override void Load(ContainerBuilder builder)
 {
 builder.RegisterType<TestContext>();

 builder.RegisterGeneric(typeof(TestRepository<,>)).As(typeof(IRepository<,>))
 .InstancePerLifetimeScope();
 }
}

這里的Module和IModule是autofac的,功能已經實現了,但是作為框架來說直接暴露了autofac的東西顯然是不合適的,下一步要實現一個框架自身的模塊加載方式.

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

asp.net core 實現一個簡單的倉儲的方法

asp.net core 實現一個簡單的倉儲的方法:一直有自己寫個框架的想法,但是一直沒有行動起來,最近比較閑,正好可以開工了. 現在已經完成了兩部分.1.一個簡單倉儲,實現使用的是ef 2.IOC部分,這里是把內置的ioc替換成了aotofac,這部分感覺還是有一點缺陷的.下面說 倉儲部分 這里主要是接口是實現,目前使
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 日本高清在线播放一区二区三区 | 欧美日本日韩aⅴ在线视频 欧美日韩91 | 中文字幕免费在线播放 | 亚洲欧洲在线观看 | 日日操狠狠干 | 亚洲欧美另类在线 | 国产精品高清一区二区三区不卡 | 国产成人一区 | 亚洲成色999久久网站 | 蜜臀91精品国产高清在线观看 | 亚洲成人99 | 成人区精品一区二区毛片不卡 | 国产精品麻豆a在线播放 | 不卡视频在线 | 综合婷婷 | 日韩午夜视频在线观看 | 国产精品久久亚洲一区二区 | 国产资源在线看 | 精品一区二区三区五区六区 | 日韩经典第一页 | 亚洲欧美日韩综合精品网 | 能看毛片的网站 | 亚洲欧美日本综合 | 久久久久88色偷偷免费 | 四虎免费在线观看视频 | 日本成本人观看免费fc2 | 亚洲国产精久久久久久久 | 欧美在线日韩在线 | 97热久久免费频精品99国产成人 | 欧美日韩亚洲无线码在线观看 | 一区二区精品视频 | 精品一区二区三区五区六区七区 | 欧美成人h精品网站 | 黄网站色视频免费观看 | 精品国产系列 | 日本激情网址 | 免费看特级淫片日本 | 亚洲一区中文字幕在线观看 | 国产va免费精品 | 日韩高清第一页 | 国产成人麻豆精品video |