亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-05-21 11:49:56 來源:億速云 閱讀:335 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關asp.net core怎么實現一個簡單的倉儲的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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

現在已經完成了兩部分.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的東西顯然是不合適的,下一步要實現一個框架自身的模塊加載方式.

ASP.NET 是什么

ASP.NET 是開源,跨平臺,高性能,輕量級的 Web 應用構建框架,常用于通過 HTML、CSS、JavaScript 以及服務器腳本來構建網頁和網站。

關于“asp.net core怎么實現一個簡單的倉儲的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

闽清县| 久治县| 永寿县| 吴桥县| 黄浦区| 宜阳县| 璧山县| 屏山县| 黄冈市| 博爱县| 扬州市| 桃园市| 太仓市| 安新县| 晋城| 佛教| 宜宾县| 丹棱县| 浦东新区| 十堰市| 珠海市| 镇平县| 石柱| 汝南县| 凤翔县| 锡林郭勒盟| 陇川县| 涞源县| 安徽省| 阳江市| 泌阳县| 桂阳县| 寿光市| 纳雍县| 合川市| 梧州市| 红河县| 祁阳县| 安丘市| 洮南市| 抚远县|