It's not a simple question. If look into the red book, Vaughn Vernon encourages us to reference aggregates by ids, but only aggregates! If wheel is an entity then you have to pass it as object.
The most difficult part here is to separate aggregates from entites, to do that you have to know what invariants you got in your aggregate.
Here are few reasons why should reference aggregates by ids:
when you have to reconstitute aggregate, you also have to load all referenced aggregates, and if object graph is large, then every load of Your aggregate can be very slow. You can overcome this by using lazy loading, but with that you get another problems, which I won't cover here.
when you store aggregate, you have to also check if referenced aggregates weren't changed, so you have to store them also, or just store every referenced aggregate by default, which is really performance unwise.
by storing few aggregates at once, you can have concurrency problems because of collaborative nature of Your domain. That way app can become even unusable
However, sometimes it's hard to reference all aggregates by ids, it depends on Your domain.