Область параметров конструктора StructureMap - PullRequest
1 голос
/ 21 апреля 2011

Я искал весь день и не могу понять это. Надеюсь, об этом раньше не спрашивали.

ObjectFactory.Initialize(
    x =>
        {
            x.For(typeof (IRepository<>))
             .Use(typeof(Repository<>))
             .CtorDependency<DbContext>("dbContext")
             .Is(new DbContext());
        }
    );

Мне нужна структура, чтобы использовать новый экземпляр DbContext каждый раз, когда он создает новый экземпляр репозитория. Сейчас я считаю, что он повторно использует DbContext и вызывает проблемы. Я полагаю, что он повторно использует только «DbContext», потому что я попытался установить жизненный цикл в «Репозитории» на PerRequest с тем же результатом. Любая помощь очень ценится.

Я новичок в StructureMap и Dependency Injection, поэтому я могу ошибаться в своем анализе.

Обновление

@ Фейберг, большое спасибо за ваш ответ. Звонил звонок, и я помню, что лямбда-выражение, начинающееся с '()', я не видел раньше. Я был очень взволнован, что это было это. Я пробовал ваш код дословно, и он не может разрешить Ctor, поэтому я изменил его на это.

                        x.For(typeof(IRepository<>))
                      .HttpContextScoped()
                      .Use(typeof(Repository<>))
                      .CtorDependency<DbContext>("dbContext")
                      .Is(() => new DbContext());       

И я получаю следующую ошибку компиляции

"Не удается разрешить метод 'Is (выражение Lamda)', кандидатами являются: StructureMap.Pipeline.ConfiguredInstance Is (object) (в классе ChildInstanceExpression) StructureMap.Pipeline.ConfiguredInstance Is (StructureMap.Pipeline.Instance) (в классе ChildInstanceExpression) .

Я видел это сообщение до того, как вспомнил, и это привело к тому, что я попытался зарегистрировать свой тип dbContext, хотя я не знаю, можете ли вы, и правильно ли я это делал, скажем, x.For (конкретный тип). Использование (конкретный тип) ,

Ответы [ 2 ]

0 голосов
/ 14 июня 2013

Использование

x.For<IRepository>()
    .HttpContextScoped()
    .Use<Repository>()
    .CtorDependency<DbContext>("dbContext")
    .Is(ctx => new DbContext());

.Is() принимает тип Func<IContext, T>

0 голосов
/ 21 апреля 2011

Ваш анализ верен.Вы конфигурируете структурную карту для использования экземпляра, передаваемого методу Is, для эффективного создания синглтона.Чтобы создать новый экземпляр для запроса Http, используйте:

x.For(typeof (IRepository<>))
  .HttpContextScoped()
  .Use(typeof(Repository<>))
  .Ctor<DbContext>("dbContext")
  .Is(() => new DbContext());

Обратите внимание на лямбду, являющуюся аргументом Is.Это приводит к тому, что оценка создания выполняется каждый раз, когда разрешается зависимость.Метод HttpContextScoped заставляет Карту структуры кэшировать репозиторий во время запроса Http.

...