使用StructureMap为特定情况注入不同的对象到构造函数中

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。

此外,第二个DataContext应该由SM进行混合缓存!

2个回答

4

Something like...

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

这真的对我有很大帮助。在构造函数中使用一个具体类,该类在其构造函数中根据使用它的“父”类不同而获得不同的连接字符串。谢谢。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接