Take it as something like this....To use a very good persistence layer as
NHibernate you must pay something... to have a private default ctor is a
really cheap cost ;)
To use lazy-loading in a entity instance without inherit from a special
class (that mean use a DynamicProxy system) you must pay something... have
all virtual methods it is not so cheap but it is an acceptable cost to pay
for a so powerful feature.
To use lazy-loading for a collection you must pay something... you can
declare a ConcreteCollectionClass in your entity but you must use an
interface; another cheap cost

In this capitalist world nothing is for free ;)

2008/12/30 Krzysztof Koźmic <krzysztof.koz...@gmail.com>

>  Now *that* was an exhaustive answer.
>
> Actually when, I think about what you said about different constraints in
> different contexts it makes sense.
> It's just moving the burden of ensuring the validity of an entity from the
> compiler level up.
> In this case, If I have, say, a Customer by bussiness rule requires it to
> have a name and an address (for example), bu this is not enforced by the
> compiler in form of required .ctor parameters, checked for null.
> I'm still however not completely sold on this idea, here's why.
>
> If I can write "new Customer()", I can't make any assumptions about it.
> At any point, calling Customer.Name.ToUpper() may result in
> NullReferenceException.
>
> from domain point of view, it would make sense to keep it readonly and
> injectable by constructor, so that I have an explicit contrant: "If I get a
> customer, it *always* has a non-null name". Without it, I'd have to check it
> for null all the time.
>
> Now, back to persistence: If I require Name to be not-null, if I get a
> customer from the DB, it seems reasonable that ORM should figure out that
> Name it just got from the DB should be put as .ctor parameter "name", as it
> corresponds to Name property defined in the mapping.
>
> With that I get better encapsulation, and I'm less persistance-dependent.
>
> Still, I may be totally wrong here.
>
> Krzysztof
>
>
> Fabio Maulo pisze:
>
> Yes I understand that you are not talking about IoC but what you want is to
> use a specific ctor for business constraint.
> If you want you can do it using a specific tuplizer for each entity but it
> is to much work for you; for that reason "we" prefer to have a private
> default ctor for persistence matters and a public ctor for business matters.
> If you use a no default ctor you are loosing some other feature as "query
> by example" and something else...
>
>  Now... (IMO)
> -If I write "new Customer()" there is no problem until I don't use that
> instance for business matters...
> Well perhaps a "Customer" is not a better example here... what about a "new
> DateTime(1,1,1)" ?
>
>  -In theory each class may have different rules in different context; a
> customer sure must have a "denomination" but is you want use it in an
> invoice it must have an Address; for an Invoice an Address with Street and
> Number is enough but if you want use it to send Products to the Customer the
> Address must have a PostalCode. For each of these constraint you may have a
> specific ctor but at that point is better to have a "ValidatorClass" to
> validate each instance in each specific context.
>
>  -The ctor constraint may have sense when you are creating a really new
> instance but when the instance come from DB is because it is , in general, a
> valid persistent instance and for that the default ctor is more than enough.
>
>
>  The end:
> If you want work a lot use a specific tuplizer for each entity class to use
> a specific ctor.
> If you don't want work a lot use a private default ctor.
>
>
> 2008/12/30 Krzysztof Koźmic <krzysztof.koz...@gmail.com>
>
>> Fabio,
>>
>> I've read that post. That is not however what I've been talking about.
>> What in case
>>
>> Invoice
>>
>> class from your example took in its .ctor not only calculator but also
>> description (and if description property and field was readonly)
>>
>> Krzysztof
>>
>> Fabio Maulo pisze:
>>
>> http://fabiomaulo.blogspot.com/2008/11/entities-behavior-injection.html
>>
>> 2008/12/29 Krzysztof Koźmic <krzysztof.koz...@gmail.com>
>>
>>>
>>> I'm thinking, why actually NHibernate require entities to have
>>> parameterless constructor.
>>> I know that I can make it non-public, but still, for a lot of entities
>>> it simply smells. For example, it doesn't make sense to have a customer
>>> without name, or Order without Item. To throw a buzzword at you, it's
>>> persistence-ignorance hole. A requirement I must satisfy in order to use
>>> certain persistence mechanism.
>>> What if, instead NHibernate was smart enought to use the non-default
>>> constructor?
>>> for example if I have a customer class
>>>
>>> public class Customer
>>> {
>>>  private readonly string name;
>>>
>>>  public Customer(string name){...}
>>>
>>>  public string Name { get {...}}
>>> }
>>>
>>> Why can't NHibernate figure it out how to create a customer, when it
>>> already has all it needs (a name).
>>> Does it make even sense?
>>>
>>> Cheers,
>>> Krzysztof
>>>
>>>
>>>
>>>
>>>
>>>
>>
>>
>> --
>>  Fabio Maulo
>>
>>
>>
>>
>>
>>
>
>
> --
> Fabio Maulo
>
>
>
>
> >
>


-- 
Fabio Maulo

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to nhusers@googlegroups.com
To unsubscribe from this group, send email to 
nhusers+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to