C# 如何使用StructureMap将同一接口映射到不同的ConcreteClass?

C# 如何使用StructureMap将同一接口映射到不同的ConcreteClass?,c#,structuremap,C#,Structuremap,创建Controller1时,我希望IService映射到ConcreteService1,IPageService映射到ConcretePageService1 当创建Controller2时,我希望IService映射到ConcreteService2,IPageService映射到ConcretePageService2 如何初始化ObjectFactory以使上述功能正常工作 当我以这种方式初始化ObjectFactory时: ObjectFactory.Initialize(x =&

创建Controller1时,我希望IService映射到ConcreteService1,IPageService映射到ConcretePageService1

当创建Controller2时,我希望IService映射到ConcreteService2,IPageService映射到ConcretePageService2

如何初始化ObjectFactory以使上述功能正常工作

当我以这种方式初始化ObjectFactory时:

 ObjectFactory.Initialize(x =>
    {  
         x.For<IService>().Use<ConcreteService1>();
         x.For<IPageService>().Use<ConcretePageService1>();
    });

查看StructureMap的ConstructedBy()语法

在本页上,但我不确定这些是否是SM的最新文档:

我对Constructedby的看法可能是错误的——文档不是很好。有关类似问题,请参见以下内容:


如果只是一个独立的注册,您可以使用命名实例将特定实例映射到每个控制器

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"));
For().Add().Named(“service1”);
For().Add().Named(“service2”);
For().Add().Named(“pageService1”);
For().Add().Named(“pageService2”);
For().Use()
.Ctor()是(c=>c.GetNamedInstance(“service1”))
.Ctor()是(
c=>c.GetNamedInstance(“pageService1”);
For().Use()
.Ctor()是(
c=>c.GetNamedInstance(“service2”))
.Ctor()是(
c=>c.GetNamedInstance(“pageService2”);
如果这是一个在应用程序中重复的模式,那么应该使用映射来映射类型,以避免所有这些重复

可以使用内置约定添加按类型名称命名的类型

Scan(x =>
  {
    x.AssembliesFromApplicationBaseDirectory();
    x.AddAllTypesOf<IService>().NameBy(type => type.Name);
    x.AddAllTypesOf<IPageService>().NameBy(type => type.Name);
    x.WithDefaultConventions();
  });
扫描(x=>
{
x、 AssembliesFromApplicationBaseDirectory();
x、 AddAllTypesOf().NameBy(type=>type.Name);
x、 AddAllTypesOf().NameBy(type=>type.Name);
x、 使用默认约定();
});

我读过,但我不明白这是如何回答我的问题的,还是我遗漏了什么?谢谢,在国际海事组织,附加条件不是解决问题的办法。一项公约更有可能是一个持久的解决办法。谢谢你。StructureMap文档非常复杂,我找不到它。
Scan(x =>
  {
    x.AssembliesFromApplicationBaseDirectory();
    x.AddAllTypesOf<IService>().NameBy(type => type.Name);
    x.AddAllTypesOf<IPageService>().NameBy(type => type.Name);
    x.WithDefaultConventions();
  });