2011-06-27 27 views
1

我有一些類如何使用StructureMap對類型進行分組?

public interface IProvider 
{ 
    void Load(int id); 
} 
public class Provider1 : IProvider 
{ 
    public void Load(int id) {} 
} 
public class Provider2 : IProvider 
{ 
    public void Load(int id) {} 
} 
public interface IService 
{ 
    void Load(int id); 
} 
public class Service : IService 
{ 
    IProvider provider; 
    public Service(IProvider provider) { this.provider=provider; } 
    public void Load(int id) { provider.Load(id); } 
} 

和我登記他們StructureMap這樣的:

For<IService>().Use<Service>().Named("core"); 
For<IProvider>().Use<Provider1>().Named("core"); 
For<IService>().Use<Service>().Named("gen"); 
For<IProvider>().Use<Provider2>().Named("gen"); 

但是當我試圖通過

var service1 = ObjectFactory.GetNamedInstance<IService>("core"); 
var service2 = ObjectFactory.GetNamedInstance<IService>("gen"); 

因此,在這兩種情況下獲得服務IProvider實例化給Provider2,爲什麼?

我預計第一種情況的IProvider將實例化到Provider1 和第二種情況,以Provider2之間

那麼,如何我需要爲了得到我想要的東西登記呢?

回答

2

你不告訴structuremap哪些依賴服務的不同實例擁有。爲了說明,請使用Ctor method指示在創建實例時應傳遞什麼參數。

For<IProvider>().Add<Provider1>().Named("core"); 
For<IProvider>().Add<Provider2>().Named("gen"); 
For<IService>().Add<Service>() 
    .Ctor<IProvider>("provider").Is(c => c.GetInstance<IProvider>("core")) 
    .Named("coreService"); 
For<IService>().Add<Service>() 
    .Ctor<IProvider>("provider").Is(c => c.GetInstance<IProvider>("gen")) 
    .Named("genService"); 

請注意使用添加代替使用。 add表示我們正在添加一個新的實例,use表示一個實例應該是默認的。所以,如果你希望能夠有核心默認就可以作爲註冊如下:

For<IProvider>().Use<Provider1>(); 
For<IProvider>().Add<Provider2>().Named("gen"); 
For<IService>().Use<Service>(); 
For<IService>().Add<Service>() 
    .Ctor<IProvider>("provider").Is(c => c.GetInstance<IProvider>("gen")) 
    .Named("genService"); 

和解決這樣的實例:

var score = ObjectFactory.GetInstance<IService>(); 
var sgen = ObjectFactory.GetNamedInstance<IService>("genService"); 
0

你可以試着告訴structuremap你想要的實例IProvider爲服務1,像這樣的名字:

For<IService>().Use<Service>().Named("core").Ctor<IProvider>().Is(y => y.GetInstance<IProvider>("core"));