对于某些情况,使用StructureMap将不同的对象注入构造函数

时间:2009-03-27 16:11:03

标签: c# .net inversion-of-control structuremap

我有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&lt; SpecificObject&gt;我想注入不同的DataContext。当我要求IReposiotry&lt; SpecificObject&gt;时,怎么说SM呢?我想要不同的DataContext,而不是FirstDataContext,而是SecondDataContext(DC转到不同的数据库)。

例如,当我要求IRepository&lt; T&gt;时我希望注入FirstDataContext,但是当我要求明确表示IRepository&lt; Product&gt;我想要注入SecondDataContext。

此外,第二个DC应该是SM的混合缓存!

2 个答案:

答案 0 :(得分: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"));

答案 1 :(得分: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>();
                                     });