Как мне использовать IoC в этом фрагменте кода winform? - PullRequest
4 голосов
/ 19 марта 2010

У меня есть приложение winform в visual studio 2010. Мое приложение выполняет следующие действия:

  • Получите список файлов, которые мне нужно прочитать, а затем вставить в базу данных.
  • Для каждого файла прочитайте данные и вставьте в БД.

Итак ... это код, который у меня есть.

// *******
// *** How should the _repository be Injected??
// *******
var list = _repository.GetFileList();
if (list != null)
{
    int i = 0;
    foreach(var file in list)
    {
       i++;
       var service = new MyService(i, _repository);
       service.ParseAndSave();
    }
}

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

Во-первых, я не уверен, должен ли я использовать IoC в этом случае. Я считаю, что так и должно быть, потому что тогда мне не нужно тесно связывать эту winform с репозиторием.

Во-вторых, я попытался использовать репозиторий Singleton, который мне не нужен, и могу подтвердить, что он убивает этот код (сбои за исключением).

Некоторые другие заметки (которые не должны влиять на этот вопрос) - Использование Entity Framework для ASP.NET 4. - Использование StructureMap для IoC

Может кто-нибудь помочь, пожалуйста?

UPDATE

О, я забыл упомянуть. Когда я не указываю тип жизненного цикла (например, Singleton и т. Д.). мои объекты, которые я пытаюсь сохранить, просто не сохраняйте. (т.е. ничего не отправляется в БД, глядя на SQL Profiler). Если я использую Singleton с одним файлом ... это работает. Синглтон с 2+ файлами, затем исключение / сбой из-за (внутреннего EF) первичного ключа конфликтует с Entity Framework. Так что, если мне нужно использовать Singleton, проблема должна быть в том, как я настроил свой контекст EF4.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2010

У вас есть два основных варианта: Инъекция в конструктор (как в примере с Марком Симанном) или Инъекция свойства (в сеттер) (если поддерживается вашим контейнером, например, Unity)

В случае winform вам нужно либо использовать инъекцию Property (setter), которая позволяет использовать конструктор по умолчанию, либо снова, как предлагает Марк, используя форму в качестве простого средства отображения данных, и в этом случае вам следует возможно рассмотрим вариант Pattern Viewer Presenter (обратите внимание на ссылку, эта модель была доработана и подразделена)

В его работе рассматривается пример кода для проекта MS Patterns and Practices Prism для некоторых примеров, в которых используется подход MVP с Unity

0 голосов
/ 19 марта 2010

Конструктор Инъекция всегда хорошее начало

public MyClass(IRepository repository)
{
    if(repository == null)
    {
        throw new ArgumentNullException("repository");
    }

    this.repository = repository;
}

Однако в Windows Forms вы сталкиваетесь с тем, что ваши классы форм должны иметь конструкторы по умолчанию для поддержки функций времени разработки в Visual Studio. Вы можете решить эту проблему, убедившись, что ваши формы - не что иное, как глупые средства визуализации данных .

...