5

IRepository <T>と、実装SqlRepository<T>があります。SqlRepositoryには、コンストラクターにDataContextパラメーターがあります。

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 <SpecificObject>を要求するときに、FirstDataContextではなくSecondDataContext(DCが別のデータベースに移動する)ではなく、別のDataContextが必要であるとSMをどのように言いますか。

たとえば、IRepository <T>を要求する場合は、FirstDataContextを注入しますが、IRepository <Product>を明示的に要求する場合は、SecondDataContextを注入します。

また、そのSecondDCはSMによってハイブリッドキャッシュされる必要があります!

4

2 に答える 2

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"));
于 2009-03-27T18:47:02.927 に答える
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>();
                                     });
于 2009-07-15T20:18:51.290 に答える