Ad2.Вы должны добавить в свои настройки недействительные dll.
Ad3.Инверсия управления (IoC) не имеет ничего общего с интерфейсами и классами.Вы можете иметь высокосвязанный код с инверсией управления.
class GodClass
{
void DoSth(int param)
{
switch (param)
{
case 0: Console.WriteLine("param is 0"); break;
case 1: Console.WriteLine("param is 1"); break;
}
}
}
, а с IoC он может выглядеть так:
class GoodClass
{
Dictionary<int, BaseClass> _consoleWriters;
public GoodClass( IEnumerable<BaseClass> writers )
{
foreach (var writer in writers)
_consoleWriters.Add( writer.ParamSupported, writer);
}
void DoSth(int param)
{
_consoleWriters[ param ].DoSth();
}
}
abstract class BaseClass
{
abstract int ParamSupported {get;}
abstract void DoSth(int param);
}
class ZeroWriter : BaseClass
{
override int ParamSupported {get{return 0;}}
override DoSth(int param) { Console.WriteLine("param is 0"); }
}
class OneWriter : BaseClass
{
override int ParamSupported {get{return 1;}}
override DoSth(int param) { Console.WriteLine("param is 1"); }
}
Ad1.Я бы добавил конфигурацию / инициализацию инфраструктуры IoC в функцию Main и передал бы ссылку на инициализированный контейнер остальной части кода.