【问题标题】:ASP.NET Boilerplate IRepository extension methodASP.NET Boilerplate IRepository 扩展方法
【发布时间】:2018-04-12 09:51:55
【问题描述】:

对于Organization Units,我们使用以下代码获取组织单位中的实体,包括其子组织单位。是否合理以及如何扩展IRepository 将此功能添加到所有实体?

public virtual List<Product> GetProductsInOuIncludingChildren(long organizationUnitId)
{
    var code = _organizationUnitRepository.Get(organizationUnitId).Code;

    var query =
        from product in _productRepository.GetAll()
        join organizationUnit in _organizationUnitRepository.GetAll() on product.OrganizationUnitId equals organizationUnit.Id
        where organizationUnit.Code.StartsWith(code)
        select product;

    return query.ToList();
}

【问题讨论】:

    标签: c# repository extension-methods asp.net-boilerplate irepository


    【解决方案1】:

    首先,继承IMustHaveOrganizationUnit:

    public class Product : Entity, IMustHaveOrganizationUnit
    {
        public long OrganizationUnitId { get; set; }
    }
    

    然后定义扩展方法:

    public static class RepositoryExtensions
    {
        public static List<TEntity> GetAllInOuIncludingChildren<TEntity, TPrimaryKey>(
            this IRepository<TEntity, TPrimaryKey> repository,
            long organizationUnitId
        )
            where TEntity : class, IEntity<TPrimaryKey>, IMustHaveOrganizationUnit
        {
            using (var organizationUnitRepository = repository.GetIocResolver().ResolveAsDisposable<IRepository<OrganizationUnit, long>>())
            {
                var code = organizationUnitRepository.Object.Get(organizationUnitId).Code;
    
                var query =
                    from entity in repository.GetAll()
                    join organizationUnit in organizationUnitRepository.Object.GetAll() on entity.OrganizationUnitId equals organizationUnit.Id
                    where organizationUnit.Code.StartsWith(code)
                    select entity;
    
                return query.ToList();
            }
        }
    }
    

    用法:

    var products = _productRepository.GetAllInOuIncludingChildren(organizationUnitId);
    

    【讨论】:

      【解决方案2】:

      你可以使用下面的代码。

      界面:

      public interface ITestRepository : IRepository<Test, int>
      {
      
      }
      

      类:

      public class TestRepository : YourProjectNameRepositoryBase<Test, int>, ITestRepository
      {
          public TestRepository(IDbContextProvider<YourProjectNameDbContext> dbContextProvider, IObjectMapper objectMapper)
              : base(dbContextProvider, objectMapper)
              {
              }
      }
      

      用法:

      public class TestAppService : YouProjectNameAppServiceBase, ITestAppService
      {
          private readonly ITestRepository _testRepository;
          public TestAppService(ITestRepository testRepository,
          
      }
      

      更新

      在最新版本中,无需传递objectmapper,需要使用下面更新的构造函数:

      public class TestRepository : YourProjectNameRepositoryBase<Test, int>, ITestRepository
      {
          public TestRepository(IDbContextProvider<YourProjectNameDbContext> dbContextProvider)
              : base(dbContextProvider)
              {
              }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        相关资源
        最近更新 更多