<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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
        主站蜘蛛池模板: 亚洲国产精品尤物yw在线| 成在线人永久免费视频播放| 中文字幕人成人乱码亚洲电影| 国产区图片区小说区亚洲区| 老司机永久免费网站在线观看| 亚洲一区二区三区成人网站| 成人免费视频小说| 国产成人人综合亚洲欧美丁香花 | 5g影院5g天天爽永久免费影院 | 啦啦啦中文在线观看电视剧免费版| 亚洲天堂福利视频| 无限动漫网在线观看免费| 456亚洲人成影院在线观| 四虎成人精品一区二区免费网站| 亚洲成av人无码亚洲成av人| 亚洲国产精品一区二区九九 | 一级毛片视频免费观看| 亚洲色婷婷六月亚洲婷婷6月| 日韩视频免费在线观看| 亚洲国产情侣一区二区三区| 在线免费观看一级片| 午夜成人无码福利免费视频| 日本亚洲成高清一区二区三区 | 香蕉视频在线观看免费国产婷婷| 成人婷婷网色偷偷亚洲男人的天堂| 亚洲国产成人精品无码久久久久久综合| 久久免费99精品国产自在现线| 亚洲天堂久久精品| 国产精品无码一二区免费| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 三年在线观看免费观看完整版中文| 亚洲AV日韩AV鸥美在线观看| 成年女人毛片免费播放视频m| 人人爽人人爽人人片av免费| 久久久亚洲欧洲日产国码农村| 两个人的视频高清在线观看免费| 一级一级一级毛片免费毛片| 中文字幕在线观看亚洲| 亚洲第一页综合图片自拍| 2021国内精品久久久久精免费| 国产亚洲精品91|