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。我怎么说 SM 当我要求 IReposiotry<SpecificObject> 我想要不同的 DataContext,而不是 FirstDataContext 而是 SecondDataContext(那个 DC 去不同的数据库)。

例如,当我要求 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 回答