Внедрить другой объект в конструктор с помощью StructureMap для определенного случая - PullRequest
5 голосов
/ 27 марта 2009

У меня есть IRepository , а реализация SqlRepository . 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 я хочу ввести другой DataContext. Как мне сказать SM, что когда я запрашиваю IReposiotry , я хочу другой DataContext, не FirstDataContext, а SecondDataContext (этот DC идет в другую базу данных).

Например, когда я запрашиваю IRepository , я хочу, чтобы FirstDataContext был внедрен, но когда я спрашиваю explicity для IRepository , я хочу, чтобы SecondDataContext был внедрен.

Также, что SecondDC должен быть гибридным кэшированным SM!

Ответы [ 2 ]

4 голосов
/ 27 марта 2009

Что-то вроде ...

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 голос
/ 16 июля 2009

Это действительно помогло мне тоже. Имейте конкретный класс, используемый в конструкторе, который в свою очередь получает различную строку соединения в своем конструкторе в зависимости от того, какой «родительский» класс использует его. Спасибо.

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