2011-06-27 3 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

あなたはこのような名前を持つサービス1のためにしたいIProviderのどのインスタンスのStructureMapを語って試すことができます:

For<IService>().Use<Service>().Named("core").Ctor<IProvider>().Is(y => y.GetInstance<IProvider>("core")); 
関連する問題