Как правильно реализовать Di в WinForms - PullRequest
0 голосов
/ 12 февраля 2020

Я создаю приложение Winforms. У меня есть несколько проектов. Основной проект - это проект winforms. У меня есть проект БД (с использованием ядра EF) и бизнес-проект с моими сервисами. Я использую Ninject для DI-инъекции бизнес-сервисов. Я инициализирую StandartKernel в основной форме со всеми моими зарегистрированными привязками. Поэтому, когда я открываю форму из главной формы, я передаю необходимые службы из ядра конструктору формы. Проблема в том, когда я хочу создать форму из другой формы (не из основной). Пример: Из главной формы я создаю ClientForm, но я хочу добавить в коллекцию клиента "Cars" новый объект, поэтому я хочу создать Car Форма непосредственно из ClientForm. И вот проблема: в ClientForm у меня нет CarService для перехода на новую форму, у меня есть только ClientService. Какое лучшее решение сделать DI в таком проекте? Я думаю сделать все мои услуги стати c, но ... Любое другое решение?

1 Ответ

0 голосов
/ 14 февраля 2020

Ну, я работал с чем-то подобным в эти дни. Я использовал Unity Container, чтобы сделать свой DI. Код не является полностью полным и не оптимизирован вообще.

Если вы видели или использовали ASP. NET API, я попытался воспроизвести ту же операцию в приложении windows форм.

Я использовал метод расширения, как показано ниже, чтобы добавить все свои формы в контейнер Unity.

    public static void AddForms(this IUnityContainer container, Assembly assembly = null)
    {
        if (assembly == null) assembly = Assembly.GetCallingAssembly();

        foreach (var form in assembly.GetTypes().Where(x => typeof(Form).IsAssignableFrom(x)))
        {
            var initForm = form.GetCustomAttribute<InitialFormAttribute>();
            if (initForm != null)
            {
                container.RegisterType(typeof(Form), form, "InitialForm", new TransientLifetimeManager());
            }
            else
            {                    
                container.RegisterType(form, new TransientLifetimeManager());
            }

        }
    }

И использовать некоторое кодирование для реализации запуска, как в ASP. NET. При запуске я добавил EF Core DbContext в контейнер, так же, как я добавил все, что мне нужно, чтобы Unity Container мог просто создавать экземпляры форм для меня, и у меня всегда есть доступ к моим службам в формах.

Если вы хотите увидеть полный код, оставьте комментарий ниже.

...