在领域驱动设计,似乎有很多的协议,任何单位不得直接访问存储库.
这是来自Eric Evans Domain Driven Design的书,还是来自其他地方?
对于它背后的推理,哪里有一些很好的解释?
编辑:澄清:我不是在谈论将数据访问分离到业务逻辑的单独层的经典OO实践 - 我在谈论DDD中的特定安排,实体不应该与数据对话访问层(即它们不应该包含对Repository对象的引用)
更新:我给了BacceSR赏金,因为他的回答似乎最接近,但我仍然对这个问题一无所知.如果它有这么重要的原则,肯定会在网上有一些关于它的好文章吗?
更新:2013年3月,关于这个问题的投票意味着人们对此很感兴趣,即使有很多答案,我仍然认为如果人们有这方面的想法,还有更多的空间.
oop domain-driven-design s#arp-architecture repository-pattern
我刚刚开始使用DDD,所以这可能是个愚蠢的问题......
是否可以让实体访问存储库(通过某个IRepository接口)在运行时获取值?例如,我想对属性强制执行"默认"选择:
class Person {
private Company _employer;
public Company Employer {
get { return _employer; }
set {
if(value != null) {
_employer = value;
} else {
_employer = employerRepository.GetDefaultEmployer();
}
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,做这样的事情是对DDD原则的可怕违反.如果不是,我的下一个问题是提供存储库使用的最佳方式是什么?是否应该在创建Person对象时提供?
谢谢,P
只是想知道其他人如何分层他们的架构.说我有我的图层如下:
领域层
-产品
--ProductService(如若小鬼进入这一层?)
--IProductService
--IProductRepository
Infrastructure Layer
--ProductRepository(我域中IProductRepository的Imp)
现在,当创建新产品时,我需要通过调用ProductService.GetNextProductId()方法来分配产品ID.
由于服务依赖于存储库,因此我使用IProductRepository接口设置ProductService ctor,该接口可以在以后注入.这样的事情:
public class ProductService : IProductService
{
private IProductRepository _repository;
public ProductService(IProductRepository repository)
{
_repository = repository;
}
public long GetNextProductId()
{
return _repository.GetNextProductId();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我在Product Class中使用该服务时,我在实例化一个新的ProductService类时引用了ctor中的Repository.在DDD中,有一个很大的不,没有这样的参考.我甚至不确定我的产品域类是否正确设置以调用该服务,有人可以建议:
public class Product : Entity
{
private ProductService _svc;
private IProductRepository _repository;
public Product(string name, Address address) //It doesnt seem right to put parm for IProductRepository in the ctor?
: base(_svc.GetNextProductId) // This is where i pass the id
{
// …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我正在尝试使用至少一个名义上的DDD类型域模型,并正在努力与某一块.
我的实体有一些业务逻辑,它使用我目前在某些域服务中的一些财务计算和速率计算,以及我在一个值对象中放置的一些常量值.
我正在努力解决如何让实体使用域服务中的逻辑,或者这些服务中的逻辑是否属于那里.这是我到目前为止:
public class Ticket
{
public Ticket(int id, ConstantRates constantRates, FinancialCalculationService f, RateCalculationService r)
{
Id = id;
ConstantRates = constantRates;
FinancialCalculator = f;
RateCalculator = r;
}
private FinancialCalculationService FinancialCalculator { get; set; }
private RateCalculationService RateCalculator { get; set; }
private ConstantRates ConstantRates { get; set; }
public int Id { get; private set; }
public double ProjectedCosts { get; set; }
public double ProjectedBenefits { get; set; }
public double CalculateFinancialGain()
{
var discountRate = …Run Code Online (Sandbox Code Playgroud) 在每天 10 小时以上学习领域驱动设计一周后,我开始感觉自己开始很好地理解它,直到我今天阅读了这篇文章:
http://blog.fedecarg.com/2009/03/15/domain-driven-design-the-repository/
那篇文章的作者说你将 Repository 注入到 Domain 对象中,这对我来说没有任何意义。
我不是这方面的专家,但我认为他是错误的,但我希望这里的一些人提供一些关于将存储库注入域对象是对还是错的意见。
上周我每天都在阅读另一篇文章和另一篇文章,他们对我来说听起来都一样(这是一件好事),直到我看到我上面发布的文章,如果我的这张照片让我三思而后行模式不正确。
您是否应该注入存储库?