I would suggest a third approach:
Edit: I updated this sample code to reflect the OP comments below.
public class Customer { public static ICollection<Customer> FindCustomers() { Collection<Customer> customers = new Collection<Customer>(); foreach (CustomerDTO dto in DAL.GetCustomers()) customers.Add(new Customer(dto));
In most cases, a custom collection is not needed - I assume this is one of these cases. You can also add utility methods per type (in this case, the Customer type), as this helps the developer to open these methods. (This question depends more on taste - since this is a static method, you can put it in any type that you need CustomerUtility or CustomerHelper for example).
My last suggestion is to return the interface type from FindCustomers() to provide you with more flexibility in the future for changes in the implementation. Obviously, DAL.GetCustomers() would have to return some type that IList<T> implemented, but then any API method (especially at another level, such as the data level) should also return interface types.
source share