As soon as you say Car with specified VIN, you make me think this is Entity, not value object... Also, if you need to "retrieve" it that implies that it is Entity, not value. Value objects don't generally need to be retrieved, you can just create one on the fly if you need one... Are you sure you are clear on distinction between entity and value elements in DDD?
ADDED: Then if Car IS an entity, from what you've said, it appears that it should be a member entity in an aggregate with Person as the aggregate root. (Although it may be the root of it's own aggregate) In any case, the Person repository should be constructed so that when you fetch the aggregate it also gets the Cars for that person. The Person class should have a property of Type Cars, or CarCollection, which is named Cars, or OwnedCars, or whatever, and the Type (Cars or CarCollection) should have an indexer that retrieves a specific Car based on the VIN.
public class Person
{
private int persId;
// other fields
private Cars cars;
public Cars Cars { get; set; }
// all other stuff
}
public class Cars: Collection<Car> // or 'public class Cars: List<Car>' or ...
{
public bool Contains(string VinNumber]
{
foreach (Car c in this)
if (c.VinNumber = VinNumber) return true;
return false;
}
public Car this[string VinNumber]
{
get
{
foreach (Car c in this)
if (c.VinNumber = VinNumber) return c;
return null;
}
}
}