繁体   English   中英

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

[英]Inject different object to constructor with StructureMap for certain case

我有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缓存的混合!

就像是...

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"));

这对我也很有帮助。 有一个在构造函数中使用的具体类,而构造函数又在其构造函数中获取不同的连接字符串,具体取决于哪个“父”类正在使用它。 谢谢。

            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>();
                                     });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM