public Instance(Args args) { using (var disposer = new Disposer()) { Logger.Trace("DbPath {0}", args.DbPath); Logger.Trace("Downloads {0}", args.Downloads); Logger.Trace("RestartDelay {0}ms", args.RestartDelay); Logger.Trace("EndPoint {0}", args.EndPoint); factory = new ShellFactory(); factory.Add(new SystemScriptable()); factory.Add(new RunnerScriptable(args.Downloads)); factory.Add(new DownloadScriptable(args.Downloads)); manager = new Manager(new Manager.Args { RestartDelay = args.RestartDelay, Root = args.Downloads, Database = args.DbPath, }); disposer.Push(manager); factory.Add(manager); listener = new Listener(new Listener.Args { ShellFactory = factory, EndPoint = args.EndPoint, }); disposer.Push(listener); factory.Add(listener); endpoint = listener.EndPoint; disposer.Push(Dispose); //ensure cleanup order listener.Start(); disposer.Clear(); } }