多个服务中的存储库对象

时间:2019-04-19 11:55:06

标签: c# .net asp.net-web-api asp.net-core architecture

我正在.Net core 2.2中做我的业余时间项目

我已经将我的项目分为4部分

1)DataLayer 2)RepositoryLayer 3)服务 4)Web-API层

我有一个模型,让我们以它为例 IPerson 。 然后我在这里有通用存储库

class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity, IPhysicalPersonEntity
    {
        private readonly DataContext _context;
        private DbSet<TEntity> _entities;
        string errorMessage = string.Empty;

        public Repository(DataContext context)
        {
            _context = context;
            _entities = context.Set<TEntity>();
        }
        public void Delete(TEntity entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity is null");
            }

            _entities.Remove(entity);
            _context.SaveChanges();
        }

        public IEnumerable<TEntity> GetAll()
        {
            return _entities
                .AsEnumerable();
        }

        public TEntity GetByIdentifyNumber(int identifyNumber)
        {
            return _entities
                .SingleOrDefault(e => e.Id == identifyNumber);
        }

        public void Insert(TEntity entity)
        {
            if(entity == null)
            {
                throw new ArgumentNullException("entity is null");
            }

            _entities.Add(entity);
            _context.SaveChanges();
        }

        public void Remove(TEntity entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity is null");
            }

            _entities.Remove(entity);
        }

        public void SaveChanges()
        {
            _context.SaveChanges();
        }

        public void Update(TEntity entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity is null");
            }

            var currentEntity = _entities
                .SingleOrDefault(e => e.Id == entity.Id);

            currentEntity = entity;

            _context.SaveChanges();
        }
    }

正如您提到的,第三层用于服务,因此这里有

服务
  1. 添加人
  2. 删除该人。
  3. 编辑人。
  4. 找到具有ID的人。
  5. 添加人员推荐。
  6. 等等。

每个服务都是具有单个接口的单个​​类。 我知道在每个服务中我都应该使用我的存储库对象和方法。

但是我的问题是:

  • 如何在每个服务中处理一个存储库对象?
  • 我不想在每个服务中创建每个存储库对象。 (或者也许这是正确的方法?)
  • 在这种情况下的最佳做法是什么?
  • 我做建筑的方式不正确吗?

2 个答案:

答案 0 :(得分:0)

我使用的是DataLayerRepositoryWebAPI相同的结构。

我按如下所示构建了结构

  • 我的存储库层与您的存储库层相同
  • 在我的WebAPI层中,我使用BaseController,而其他控制器是从BaseController派生的

    public class ApiBaseController<T> : ApiController where T : class {
    
    [HttpPut]
    [Authorize]
    [ActionName("Update")]
    [Produces("application/json")]
    public T Put([FromBody]T entity) // Update
    {
        using (MyContext db = new MyContext()) 
        {
           repository.Update(updateElement);
           return entity;
        }
    }
    
    
    [HttpPost]
    [Authorize]
    [ActionName("Add")]
    [Produces("application/json")]
    public T Post([FromBody]T entity)//Add new record
    {
        try
        {
            lock (LockObjectAdd)
            {
                using (MyContext db = new MyContext())
                {
                    Repository<T> repository = new Repository<T>(db);
                    repository.Add(entity);
                    return entity;
                }
            }
        }
        catch (Exception ex)
        {
            throw;
        }
    }
    
    }
    

和这样创建控制器;

public class ApiUserController : ApiBaseController<DataLayer.Models.User> { }

答案 1 :(得分:0)

取决于项目的体系结构和最佳实践,有时您不需要数据层  和服务分开,但有时您可以将其分开,但是您可以使用此链接  存储库模式实现: Generic-Repository-Pattern-in-ASP-NET