i puzzled on handle nested collection in business object via pure ado.net solution without 3rd-party orm frameworks, such automapper/nhibernate/ef.
please considering following scenario:
//salesorder public class salesorder { icollection<iorderitem> orderlines { get; set; } }
if retrieve salesorder entity database repository object this,
//retrieve entity via repository object isalesorderrepository repo = new salesorderrepository(dbcontext); isalesorder order1 = repo.getorderbycustomerpo("tn-2202-01");
we can use sql statement query data database , fill data corresponding properties of salesorder entity.
but how initialize nested collection object of order1.orderlines?
i think there way build order1.orderlines proxy pattern this:
public icollection<iorderitem> orderitems { { if(_orderitems == null) { iorderitemlazyloadingproxy lzproxy = new orderitemlazyloadingproxy(this); _orderitems = lzproxy.load(); return _orderitems; } } }
i confused above implementation domain object directly coupled or depend on proxy object.
so want know whether there way can handle nested collection transpaerncy in aggregate root object?
thanks.
your domain objects should have persistence ignorance. should not concerned persistence concerns directly should still pragmatic.
a repository responsible loading aggregate in entirety salesorderrepository
should load items also. go along these lines:
public class salesorder { private readonly list<salesorderitem> _items = new list<salesorderitem>(); public ienumerable<salesorderitem> items { { return new readonlycollection<salesorderitem>(_items); } } public void additem(string product, decimal price) { onadditem(new salesorderitem(product, price)); } public void onadditem(salesorderitem item) { _items.add(item); } }
your repository fetch item date , instantiate them. onadditem
used historical data , populate internal list whereas additem
actual domain command indicating new has happened.
just ideas :)
Comments
Post a Comment