English 中文(简体)
这是否是 d的反家长?
原标题:Is this a ddd anti-pattern?

是否违反“援助”规定,将一个存放处并入一个实体的物体。 我不使用接口,就清楚地看到问题,但在使用接口时确实存在问题? 守则是否低于良好或坏的格局?

public class Contact
{
    private readonly IAddressRepository _addressRepository;

    public Contact(IAddressRepository addressRepository)
    {
        _addressRepository = addressRepository;
    }

    private IEnumerable<Address> _addressBook;
    public IEnumerable<Address> AddressBook
    {
        get
        {
            if(_addressBook == null)
            {
               _addressBook = _addressRepository.GetAddresses(this.Id);
            }
            return _addressBook;
        }
    }
}
问题回答

它并非完全是一个好主意,但在某些有限的情况下可能ok。 我对你的模式感到困惑不解,因为我有时间不解地认为,解决是你的总体根源,因此,拥有一个完整的地址存放处是普通的。 根据你的例子,你可能实际上使用一张表上的数据网关或单,而不是托存。

我更喜欢用数据图表来解决这一问题(一个数据管理系统或类似的解决办法)。 基本上,我将利用我的办公室,将地址簿作为集根的zy积财产,“历史”。 只要实体要参加一届会议,就可节省你们的变动。

如果我没有使用管理办公室,我仍然倾向于具体联系存放处的实施将地址Book背书库的财产(清单或任何内容)。 我可能拥有一个存放处,把其他数据储存确知,并按要求装载。

你可以从外部注入负荷功能。 The new Lazy<T>打字, in .NET 4.0.

    public Contact(Lazy<IEnumerable<Address>> addressBook)
    {
        _addressBook = addressBook;
    }

    private Lazy<IEnumerable<Address>> _addressBook;
    public IEnumerable<Address> AddressBook
    {
        get { return this._addressBook.Value; }
    }

还注意到<代码> 国际电子计算方法;T>s,在您从询问提供者那里获得这些知识时,可能是内在的。 但对于任何其他类型,可使用<代码>Lazy<T>。

通常,在你接过DDD之后,你总是以整个的合计数运作。 存放处总是把你归为全负荷的整体根基。

象你那样,(至少是DDD)写成法典是没有意义的。 接触总量将永远包含所有地址(如果需要这些地址,我怀疑是诚实的)。

因此,在地址是实体,或很可能是该总量中的价值物体的情况下,通常联系托存器设计成整个接触总量。

因为地址是实体/项目(因此由管理) 联系总合不会有,因为你无法管理不属于这一合计数的实体。

恢复:总是装上整个接触点,并称其行为方法与其国家做些事情。

自从我问这个问题以来已经两年了,这个问题有些误解,我将尽力回答。

Rephrased question: "Should Business entity classes be fully persistance ignorant?"

我认为,实体班级应当完全不受欢迎,因为你将在你的代码基数中给他们许多位置,以便迅速成为必须把保存班子注入实体建筑商的迷惑人心,而无论它看不清。 如果你需要注射几个储存库,这一点就更加明显。 因此,我总是使用单独的手递/服务班,为各实体提供救援工作。 这些班级的修缮频率要低得多,通常会更多地控制在什么地方和什么时候。 实体班尽可能保持轻重。

现在,我总是有1个托存科生根,如果在实体与储存库分离时,我需要某种额外的业务逻辑,那么,我通常会为整体产生1个服务中心。

举出有关守则的明显例子,因为这是一个坏的例子。

而不是:

public class Contact
{
    private readonly IContactRepository _contactRepository;

    public Contact(IContactRepository contactRepository)
    {
        _contactRepository = contactRepository;
    }

    public void Save()
    {
        _contactRepository.Save(this);
    }
}

我这样做:

public class Contact
{

}

public class ContactService
{
    private readonly IContactRepository _contactRepository;

    public ContactService(IContactRepository contactRepository)
    {
        _contactRepository = contactRepository;
    }

    public void Save(Contact contact)
    {
        _contactRepository.Save(contact);
    }
}




相关问题
DDD - Returning entity in response to a service operation

I am new to domain driven development & have a simple question. If a service needs to generate some entity as a response to an operation then how should it be done? One of the ways is to inject ...

Domain Driven Design efforts in dynamic languages? [closed]

Are you aware of any DDD efforts in a dynamic language ? Practical resources on DDD tend to decrease quite dramatically when straying from enterprise-oriented solutions (a google search exluding C#, ....

Accessing domain objects in the view

If I don t want to expose the internal state of my Domain Objects, but I need to display them, I can think of three approaches. Which of these is the most "correct" (if any?). The "DTO/ViewModel ...

DDD screen cast question?

I wathced a screen cast on DDD by Greg Young the other day which spoke about persisting all state transitions of an object, instead of it s state when saved, then to load it "replay" all these ...

How to fluent-map this (using fluent nhibernate)?

I have two tables in my database "Styles" and "BannedStyles". They have a reference via the ItemNo. Now styles can be banned per store. So if style x is banned at store Y then its very possible that ...

热门标签