StructureMap Configuration Per Thread/Request for the Full Dependency Chain
- by Phil Sandler
I've been using Structuremap for a few months now, and it has worked
great on some smaller (green field) projects. Most of the
configurations I have had to set up involve a single implementation
per interface. In the cases where I needed to choose a specific
implementation at runtime, I created a factory class that used
ObjectFactory.GetNamedInstance<(). In the smaller projects, there
were few enough of these cases where I was comfortable with the
references to ObjectFactory. My understanding is that you want to
limit these references as much as possible, and ideally only reference
the ObjectFactory once.
I am working to refactor a larger codebase to use IOC/StructureMap, and am
finding that I may need many of these factory classes with
ObjectFactory references to get what I need.
Essentially, I am creating a "root service" with the ObjectFactory, so
that everything in the dependency chain is managed by the container.
The root service is created by name (i.e. "BuildCar", "BuildTruck"),
and the services needed deeper in the dependency chain could also be
constructed using the same name--so the "IAttachWheels" service could vary
based on whether a car or truck is being built. Since the class that
depends on IAttachWheels is the same in both configurations, I don't
think I can use ConstructedBy in the registry to choose the
implementation.
Also, to be clear, the IAttachWheels implementations need to be
managed by the container as well, because the dependency chain runs
fairly deep.
I looked briefly at Profiles as an option, but read (here on
StackOverflow) that changing profiles essentially changes
implementations for all threads. Is there a feature that
is similar to profiles that is thread/request specific? Is the factory class that references ObjectFactory approach the right way to go?
Any thoughts would be appreciated.