С Autofac, что было бы преимуществами и недостатками

std::map<float, MyClass*> foo;

for (const auto& any : foo) {
    MyClass *j = any.second;
    j->bar();
}

в C ++ 11 (также известный как C ++ 0x), вы можете сделать это, как в C # и Java

5
задан geo 21 March 2018 в 08:18
поделиться

3 ответа

Я не эксперт по 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();
    }
}
9
ответ дан 18 December 2019 в 09:53
поделиться

Как отметил Марк Линделл, обычно вам не нужно обращаться к контейнеру напрямую в приложении Autofac.

Рекомендуемый подход - получить к нему доступ один раз, как это сделал Марк, когда приложение запускается.

Другие компоненты, которым впоследствии необходимо создать объекты, могут объявить параметр конструктора типа IContext, который Autofac будет автоматически вводить.

Альтернативой, которая не требует какой-либо зависимости от сборки Autofac, является используйте Сгенерированные фабрики, как описано на странице: http://code.google.com/p/autofac/wiki/DelegateFactories

Надеюсь, это поможет!

3
ответ дан 18 December 2019 в 09:53
поделиться

1) Из приведенных вами примеров я могу сделать предположение, что вы пытаетесь использовать контейнер IOC в первую очередь в качестве локатора службы. Хотя его поддерживают почти все контейнеры, в основном используется Внедрение зависимостей . Это означает, что вам следует вообще избегать вызова метода Resolve и позволить контейнеру внедрять все зависимости за вас. Различия между двумя из них (Service Locator и Dependency Injection) выходят за рамки этой темы.

2) Если вы все еще хотите использовать его в качестве локатора службы, вы можете просто использовать корневой контейнер ( Program. Контейнер в вашем случае) без создания внутренних контейнеров. Последовательность будет следующей:

  • Create ContainerBuilder
  • Зарегистрируйте ваши компоненты в построителе
  • Создайте корневой контейнер: builder.Build ()
  • Получите доступ к корневому контейнеру для разрешения экземпляров компонентов

3) Иерархии контейнеров могут быть полезен в сценариях, где требуется одноэлементное поведение в различных областях:

  • Global \ Session \ Request (веб-приложения)
  • Application \ Plugin (приложения на основе подключаемых модулей рабочего стола)

BTW Autofac побуждает людей использовать помеченные контексты для решения таких проблем:

5
ответ дан 18 December 2019 в 09:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: