Хотя я вижу причину отделения регистра IoC, разрешения, освобождения от реализации приложения, я не вижу причин, по которым контейнер IoC не должен находиться в консольном приложении (корень композиции) и приложенииреализация в другой сборке.
Таким образом, консольное приложение очень просто:
- Создание контейнера
- Загрузка конфигурации контейнера
- РазрешениеПриложение
- Вызовите приложение run и передайте консольные аргументы вдоль
- , чтобы утилизировать контейнер при выходе приложения из метода 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 даже имеют функцию, позволяющую автоматически реализовывать эти фабрики интерфейсов.