如何使用StructureMap将相同的接口映射到不同的ConcreteClasses?

the*_*ist 6 c# structuremap

在创建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>();
    });
Run Code Online (Sandbox Code Playgroud)

但是,这始终映射ConcreteService1到IService和ConcretePageService1到IPageService无论控制器类型

public class Controller1 : Controller
{
    public Controller1(IService service, IPageService pageService)
    {
    }
}

public class Controller2 : Controller
{
     public Controller2(IService service, IPageService pageService)            
     {         
     }
}

public interface IService 
{
}
public class ConcreteService1:IService 
{
}
public class ConcreteService2:IService 
{
}

public interface IPageService 
{
}
public class ConcretePageService1:IPageService 
{
}
public class ConcretePageService2:IPageService 
{
}
Run Code Online (Sandbox Code Playgroud)

PHe*_*erg 12

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

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"));
Run Code Online (Sandbox Code Playgroud)

如果这是在应用程序中重复的模式,则应使用约定来映射类型以避免所有这些重复.

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

Scan(x =>
  {
    x.AssembliesFromApplicationBaseDirectory();
    x.AddAllTypesOf<IService>().NameBy(type => type.Name);
    x.AddAllTypesOf<IPageService>().NameBy(type => type.Name);
    x.WithDefaultConventions();
  });
Run Code Online (Sandbox Code Playgroud)

  • 感谢那.结构地图文档很复杂,我无法找到它. (2认同)