When Controller1 is being created, I want that IService will be mapped to ConcreteService1 and IPageService to ConcretePageService1
And when Controller2 is created,
Look into the ConstructedBy() syntax for StructureMap.
It's on this page, but I'm not sure if these are the latest docs for SM:
http://structuremap.net/structuremap/InstanceExpression.htm#section18
I might be wrong about ConsructedBy--the docs aren't very good. Look at the following for a similar question:
StructureMap Conditional use
If it's just an isolated registration you can use named instances to map a specific instance to each controller.
For<IService>().Add<ConcreteService1>().Named("service1");
For<IService>().Add<ConcreteService2>().Named("service2");
For<IPageService>().Add<PageService1>().Named("pageService1");
For<IPageService>().Add<PageService2>().Named("pageService2");
For<Controller1>().Use<Controller1>()
.Ctor<IService>().Is(c => c.GetNamedInstance<IService>("service1"))
.Ctor<IPageService>().Is(
c => c.GetNamedInstance<IPageService>("pageService1"));
For<Controller2>().Use<Controller2>()
.Ctor<IService>().Is(
c => c.GetNamedInstance<IService>("service2"))
.Ctor<IPageService>().Is(
c => c.GetNamedInstance<IPageService>("pageService2"));
If this is a pattern that's repeated in the application you should use a convention to map the types in order to avoid all this duplication.
Adding types named by type name is possible using a built in convention.
Scan(x =>
{
x.AssembliesFromApplicationBaseDirectory();
x.AddAllTypesOf<IService>().NameBy(type => type.Name);
x.AddAllTypesOf<IPageService>().NameBy(type => type.Name);
x.WithDefaultConventions();
});