Если вы абсолютно не хотите, чтобы ваш ManagerBaseFactory использовал контейнер, вы можете предоставить ему доступ ко всем реализациям ManagerBase из контейнера и заставить его вернуть правильное значение.Когда StructureMap видит IEnumerable типа в конструкторе, он внедряет все экземпляры этого типа, о которых он знает.
class ManagerBaseFactory
{
private readonly IEnumerable<ManagerBase> _managers;
public ManagerBaseFactory(IEnumerable<ManagerBase> managers)
{
_managers = managers;
}
public ManagerBase GetInstance(SomeEnum e)
{
Type t;
switch (e)
{
case SomeEnum.A:
t = typeof(Manager1);
break;
case SomeEnum.B:
t = typeof(Manager2);
break;
case SomeEnum.C:
t = typeof(Manager3);
break;
default:
return null;
}
return _managers.FirstOrDefault(m => m.GetType().Equals(t));
}
}
И, конечно, вы должны убедиться, что все ваши реализации ManagerBase загружены вконтейнер:
var container = new Container(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.AddAllTypesOf<ManagerBase>();
});
});