2009-03-27 10 views
5

私はIRepository < T>を実装し、SqlRepository < T>を実装しています。 SqlRepositoryにはコンストラクタにDataContextパラメータがあります。特定のケースのためにStructureMapでコンストラクタと異なるオブジェクトを挿入します。

SMの構成は次のようになります。

x.ForRequestedType(typeof(IRepository<>)) 
.TheDefaultIsConcreteType(typeof(SqlRepository<>)); 

x.ForRequestedType<DataContext>().CacheBy(InstanceScope.Hybrid) 
.TheDefault.Is.ConstructedBy(()=>{ 
         var dc = new FirstDataContext(); 
         dc.Log = new DebuggerWriter(); 
         return dc; 
        }); 

しかしIRepository < SpecificObjectの建設のための>私は別のDataContextを注入します。私はIReposiotryを求めるときにSMと言うのですか?< SpecificObject> FirstDataContextではなく、別のデータベースに行くSecondDataContextではなく、別のDataContextが必要です。

例えば、IRepository < T>私はFirstDataContextを注入したいのですが、私はIRepository <のために明示的に尋ねるときProduct> SecondDataContextを注入します。

また、SecondDCはSMによってハイブリッドキャッシュされる必要があります。本当にあまりにも私を助けてくれ

答えて

4

のような何か...

ForRequestedType<DataContext>() 
    .CacheBy(InstanceScope.Hybrid) 
    .AddInstances(inst => inst.ConstructedBy(() => 
     new SecondDataContext { Log = new DebuggerWriter() }) 
     .WithName("secondDataContext")) 
    .TheDefault.Is 
    .ConstructedBy(() => new FirstDataContext {Log = new DebuggerWriter()}); 

ForRequestedType<IRepository<SpecificObject>>() 
    .TheDefault.Is 
    .OfConcreteType<SqlRepository<SpecificObject>>() 
    .CtorDependency<DataContext>() 
    .Is(inst => inst.TheInstanceNamed("secondDataContext")); 
+0

偉大な、おかしなこと! –

1

。コンストラクタで使用されている具体的なクラスを持っていて、そのコンストラクタでは、どの「親」クラスがそれを使用しているかに応じて異なる接続文字列を取得します。ありがとう。

  ObjectFactory.Initialize(x=> 
            { 
             // Different connection string for each usage 
             // of the RelationalGateway class 
             x.ForRequestedType<RelationalGateway>() 
              .AddInstances(r => 
               r.ConstructedBy(() => 
                new RelationalGateway(ConfigRepository.DataSourceName)) 
              .WithName("config")) 
              .TheDefault.Is.ConstructedBy(
              () => new RelationalGateway(OracleSpatialRepository.DataSourceName)); 

             // Inject the right RelationalGateway 
             x.ForRequestedType<IConfigRepository>() 
              .TheDefault.Is.OfConcreteType<ConfigRepository>() 
              .CtorDependency<RelationalGateway>().Is(inst => 
               inst.TheInstanceNamed("config")); 

             x.ForRequestedType<ISpatialRepository>() 
              .TheDefault.Is.OfConcreteType<OracleSpatialRepository>() 
              .CtorDependency<RelationalGateway>().IsTheDefault(); 

             // Other simple types 
             x.ForRequestedType<IIdGenerator>().TheDefaultIsConcreteType<IdGenerator>(); 
            }); 
関連する問題