Внедрение зависимостей и структура проекта для консольных приложений - PullRequest
8 голосов
/ 21 марта 2012

У меня есть 4 проекта:

Core (IServer):

  • System
  • System.Core

DependencyResolver:

  • Core
  • StructureMap

Инфраструктура (служба):

  • Core
  • Внешняя зависимость

Консоль:

  • Core
  • DependencyResolver

Требования:

Я пытаюсь использовать StructureMap только в DependencyResolver.Кроме того, консольное приложение не должно ничего знать об Infrastucture.

Когда я не хочу ссылаться на StructureMap в своем консольном приложении, я должен создать ServiceLocator.

В DependencyResolver у меня есть загрузчик, которыйотвечает за вызов содержимого реестра StructureMap (Регистрация)

В моем консольном приложении я хочу получить экземпляр.Для этого мне нужно сослаться на StructureMap.Другой способ - написать небольшую оболочку для методов разрешения StructureMaps.

Есть ли другой лучший способ отсоединения консоли от StructureMap?

1 Ответ

17 голосов
/ 22 марта 2012

Хотя я вижу причину отделения регистра IoC, разрешения, освобождения от реализации приложения, я не вижу причин, по которым контейнер IoC не должен находиться в консольном приложении (корень композиции) и приложенииреализация в другой сборке.

Таким образом, консольное приложение очень просто:

  1. Создание контейнера
  2. Загрузка конфигурации контейнера
  3. РазрешениеПриложение
  4. Вызовите приложение run и передайте консольные аргументы вдоль
  5. , чтобы утилизировать контейнер при выходе приложения из метода run

С SM это выглядит примерно такэто:

public void Main(params string[] args)
{
    using (var container = new Container())
    {
        container.LoadAllConfigurationModules();
        container.AddRegistry<SomeRegistry>();
        container.GetInstance<Application>().Run(args);
    }
}

Для вещей, которые вы не можете создать при запуске, вы создаете заводской интерфейс в сборке приложения:

interface ISomeFactory { ISomeDependency CreateSomeDependency() }

и реализуете этот интерфейс в консольном приложении, вводяконтейнер и использовать его для разрешения экземпляра.Я предполагаю, что реализация SM выглядит следующим образом:

public class SomeFactory : ISomeFactory
{
    public SomeFactory(IContainer sontainer) { this.container = container; }
    ISomeDependency CreateSomeDependency() { this.container.GetInstance<ISomeDependency>(); }
}

Другие контейнеры IoC даже имеют функцию, позволяющую автоматически реализовывать эти фабрики интерфейсов.

...