尴尬的通用存储库调用

时间:2015-06-13 19:31:12

标签: c# entity-framework generics repository-pattern

我正在实施一个generic repository pattern,我现在做了很多次,但每次我这样做都会让我烦恼。

如果我有如下数据库设计。 (所有表格彼此相关。)我打电话如下

public IEnumerable<Domain> GetRealEstate()
{
     return _repository.GetAll();
}

enter image description here

我可以从那一个电话中获得所有模型(EF的奇迹)。让我烦恼的是,我必须在方法调用中说Domain,从域实体我将得到所有相关实体(Lazy loadingCompanies等。使用domain entity来获取所有公司等等感觉是错误的。我使用的回购模式是直截了当的。

有没有更好的方法来编写方法,使它看起来不那么奇怪?

以下是我的示例代码

控制器

[RoutePrefix("api/realestate")]
    public class RealEstateController : ApiController
    {
        private readonly IRealEstateService _service;

        public RealEstateController(IRealEstateService service)
        {
            _service = service;
        }

        [Route("")]
        public Task<Domain> GetRealEstates()
        {
            var collection =  _service.GetRealEstate();
            return null;
        }

        [Route("{domainName}")]
        public Task<Domain> GetRealEstate(string domainName)
        {

        }
    }

服务

public class RealEstateService : IRealEstateService
    {
        private readonly IRealEstateRepository _repository;
        public RealEstateService(IRealEstateRepository repository)
        {
            _repository = repository;
        }
        public IEnumerable<Domain> GetRealEstate()
        {
            return _repository.GetAll();
        }
    }

1 个答案:

答案 0 :(得分:0)

感觉&amp;责任......这是一个让我看到更多人挣扎的困境。我觉得感觉更容易的关键是Domain可以被认为是一个聚合根,它封装了它所有者的整个对象图。

让我们看一个比你想象的更接近的例子DbSetDbSet是一个存储库。但我认为我们大多数人认为编写像

这样的查询是完全可以接受的,甚至是良好的做法
context.Domain.Include(d => d.Companies)....

没有人会说DbSet<Domain>Company有什么关系?即使我们向Domain添加DbSet,并且通过这样做我们添加了一个完整的对象图,任何人都不会感到有任何倾向于通过其正确的&#34;添加每个对象。 DbSet。那将是一件完全无用的工作。

如果这不是一个好习惯,EF(或任何ORM)都不具备导航属性。想一想......噩梦。