std::map<float, MyClass*> foo;
for (const auto& any : foo) {
MyClass *j = any.second;
j->bar();
}
в C ++ 11 (также известный как C ++ 0x), вы можете сделать это, как в C # и Java
Я не эксперт по AutoFac, но имею опыт работы с другими контейнерами Ioc. Я думал, что этот вопрос даст мне повод попробовать AutoFac.
Проекты, основанные на контейнерах Ioc, должны стремиться изолировать весь код от доступа к контейнеру, за исключением точки входа или уровня хоста. Я создал следующий пример, используя AutoFac и WinForms, чтобы показать, как форма может получить доступ к службе через свой конструктор.
Я не совсем понимаю, почему вы думали, что вам нужен внутренний контейнер. Возможно, вы прокомментируете, и я смогу предоставить более подробный ответ.
static class Program
{
[STAThread]
static void Main()
{
var builder = new ContainerBuilder();
builder.Register<TheService>().As<INeedThisService>();
builder.Register(f => new Form1(f.Resolve<INeedThisService>())).As<Form1>();
using (var container = builder.Build())
{
Application.Run(container.Resolve<Form1>());
}
}
}
public interface INeedThisService { }
public class TheService : INeedThisService
{
public TheService() { Console.WriteLine("ctor ThisService"); }
}
public partial class Form1 : Form
{
public Form1(INeedThisService service)
{
Console.WriteLine("ctor Form1");
InitializeComponent();
}
}
Как отметил Марк Линделл, обычно вам не нужно обращаться к контейнеру напрямую в приложении Autofac.
Рекомендуемый подход - получить к нему доступ один раз, как это сделал Марк, когда приложение запускается.
Другие компоненты, которым впоследствии необходимо создать объекты, могут объявить параметр конструктора типа IContext, который Autofac будет автоматически вводить.
Альтернативой, которая не требует какой-либо зависимости от сборки Autofac, является используйте Сгенерированные фабрики, как описано на странице: http://code.google.com/p/autofac/wiki/DelegateFactories
Надеюсь, это поможет!
1) Из приведенных вами примеров я могу сделать предположение, что вы пытаетесь использовать контейнер IOC в первую очередь в качестве локатора службы. Хотя его поддерживают почти все контейнеры, в основном используется Внедрение зависимостей . Это означает, что вам следует вообще избегать вызова метода Resolve и позволить контейнеру внедрять все зависимости за вас. Различия между двумя из них (Service Locator и Dependency Injection) выходят за рамки этой темы.
2) Если вы все еще хотите использовать его в качестве локатора службы, вы можете просто использовать корневой контейнер ( Program. Контейнер в вашем случае) без создания внутренних контейнеров. Последовательность будет следующей:
3) Иерархии контейнеров могут быть полезен в сценариях, где требуется одноэлементное поведение в различных областях:
BTW Autofac побуждает людей использовать помеченные контексты для решения таких проблем: