2011-02-14 33 views
6

當創建控制器1,我想這IService將被映射到ConcreteService1和IPageService到ConcretePageService1如何使用StructureMap將相同的接口映射到不同的ConcreteClass?

並創建控制器2的時候,我想的是IService將被映射到ConcreteService2和IPageService到ConcretePageService2

如何我可以初始化ObjectFactory,以便上面的工作?

平均值,而我initialezed的ObjectFactory這樣:

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

但這始終映射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 
{ 
} 

回答

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")); 

如果這是一再在應用程序中,你應該使用一個convention的類型,以避免這一切的重複映射模式。

使用內置約定可以添加按類型名稱命名的類型。

Scan(x => 
    { 
    x.AssembliesFromApplicationBaseDirectory(); 
    x.AddAllTypesOf<IService>().NameBy(type => type.Name); 
    x.AddAllTypesOf<IPageService>().NameBy(type => type.Name); 
    x.WithDefaultConventions(); 
    }); 
0

查找到ConstructedBy( )StructureMap的語法。

正是這個頁面上,但我不知道如果這些都是最新的文檔爲SM:

http://structuremap.net/structuremap/InstanceExpression.htm#section18

我可能是錯的ConsructedBy - 該文檔是不是很好。看一個類似的問題如下:

StructureMap Conditional use

+0

我讀過它,但我不明白這是如何回答我的問題,或者我錯過了什麼?謝謝 – theateist 2011-02-14 20:02:42

+1

條件是不是去國際海事組織的方式。一項公約更可能是一個持久的解決方案。 – PHeiberg 2011-02-15 20:33:25

相關問題