0

Я немного новичок в IoC StructureMap (и IoC в целом). Из примеров, я мой материал настроить так:Закрытие подключения базы данных при использовании StructureMap IoC/Entity Framework?

DefaultRegistry:

public DefaultRegistry() { 
     Scan(
      scan => { 
       scan.TheCallingAssembly(); 
       scan.WithDefaultConventions(); 
       scan.With(new ControllerConvention()); 
      }); 
     For<IRepository>().Use<Repository>().Ctor<string>("connectionString").Is(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString); 
     //For<IExample>().Use<Example>(); 
    } 

Затем в каждом контроллере, что любое действие нуждается в базе данных, у меня есть:

private IRepository _Repository; 

    public TipsController(IRepository repository) 
    { 
     _Repository = repository; 
    } 

Когда мне нужно чтобы использовать его, я просто делаю:

data.Information = await _Repository.GetInformationAsync(); 

Когда я использовал ADO.NET, у меня всегда было использование заявления вокруг каждого Хин. Я видел примеры Entity Framework, в которых используется оператор using. Но, при использовании EF в сочетании с StuctureMap, мне нужно каким-то образом обернуть вокруг него заявление об использовании? Если да, то как?

ответ

1

Если вы создаете контекст и используете его в рамках одного метода, всегда рекомендуется обернуть использование DbContext в операторе using, как вы упомянули, однако, когда ваше время жизни DbContext не связано с выполнением один метод, тогда вы должны избавиться от контекста самостоятельно.

Обычный шаблон (и one recommended in the StructureMap 3 documentation) предназначен для установки вложенных контейнеров, которые привязаны к HttpContext.

Это работает, создавая вложенный контейнер в начале пользовательского запроса Http, а затем удаляя вложенный контейнер (и экземпляр DbContext) в конце запроса.

При использовании ORM, такого как Entity Framework с контейнером IoC, например StructureMap, вы можете использовать этот вложенный контейнер, привязанный к HTTP-запросу, для управления временем жизни вашего DbContext. Таким образом, когда начинается запрос, создается новое соединение с базой данных, а затем закрывается и удаляется в конце запроса.

This, вероятно, наиболее полный учебник, который я нашел, что лучше всего описывает создание вложенных контейнеров StructureMap, которые связаны с запросом HTTP, и почти идентично тому, как StructureMap.MVC5 пакет делает это, который ссылается в документации.

После того, как это реализовано все, что вам нужно будет сделать тянуть открытое соединение с базой данных из контейнера и утилизировать его в конце запроса Http в application_endrequest в файле Global.asax.cs

+0

Приятно, что этот парень имеет его взять на нем, но как нет официального «как» с этим? Я думаю, что это будет очень распространенная проблема. – ScubaSteve

+0

Это метод, который рекомендует документация StructureMap - http://structuremap.github.io/the-container/nested-containers/. На самом деле, если вы смотрите под «Кто использует его?» заголовок, вы увидите, что есть рекомендация использовать пакет 'StructureMap.MVC5', который хранит вложенный контейнер идентичным способом с более ранней ссылкой. Единственная причина, по которой я ссылался на этот учебник, - это дать более подробный пример того, как он работает. –

+0

Рассматривая последнюю версию кода StructureMap, похоже, что все это уже сделано для нас. – ScubaSteve