Загрузите проект Windows Forms из другой сборки
Я столкнулся с проблемой при объединении Onion Architecture со слоем пользовательского интерфейса Windows Forms. Проблема в том, что мой метод конфигурации IoC никогда не срабатывает. Настройка IoC происходит в сборке разрешения зависимостей:
Project.Core
Project.Infrastructure
Project.UI <- Startup project
Project.DependencyResolution <- IoC configuration
И я хотел бы, чтобы мой слой пользовательского интерфейса зависел ни от чего, кроме Project.Core
,
В моих веб-проектах, где я использовал эту архитектуру, я использовал WebActivatorEx и OutputTo для начальной загрузки моего IoC. Поскольку я знаком, я решил использовать то же самое здесь, но это не ведет себя, как ожидалось. Я не уверен, что у меня проблема или проблема с Windows Forms, так что вот мои настройки:
В Project.DependencyResolution:
[assembly: WebActivatorEx.PreApplicationStartMethod(
typeof (IocConfig), "RegisterDependencies")]
public class IocConfig
{
public static void RegisterDependencies() {
// this is never executed
}
}
OutputTo's OutputTargets.txt:
..\Project.UI\bin
В Project.UI:
static class Program
{
static void Main() {
WebActivatorEx.ActivationManager.RunPreStartMethods();
Application.Run(...);
}
}
Выход для копий DependencyResolution's
Файл DLL передан Ui's
бен правильно, но IocConfig.RegisterDependencies
никогда не бежит.
Итак, как я могу настроить IoC из его собственной сборки, где проект Windows Forms является проектом запуска?
1 ответ
Только что протестировал это с WebActivatorEx 2.0.0.5 (последний в NuGet). Работает отлично. Проверяется печатью чего-либо на консоли в RegisterDependencies
,
В любом случае, это не имеет ничего общего с тем, что оно является приложением WinForms (может быть консольным приложением, оно все равно должно работать).
Единственное, что приходит мне в голову, это то, что ваша сборка пользовательского интерфейса не находится рядом с другими сборками (включая WebActivatorEx). Я проверил его исходный код, и он полагается на то, что он там, так как именно там он ищет все библиотеки DLL. Можете ли вы убедиться, что сборки находятся там, где они должны быть?
Кроме того, WebActivatorEx имеет это в своем исходном коде:
try
{
return assembly.GetCustomAttributes(
typeof(T),
inherit: false).OfType<T>();
}
catch
{
// In some very odd (and not well understood) cases, GetCustomAttributes throws. Just ignore it.
// See https://github.com/davidebbo/WebActivator/issues/12 for details
return Enumerable.Empty<T>();
}
Поэтому, если вы не нашли причину вовремя, я предлагаю получить исходный код WebActivatorEx и использовать его для отладки поведения. Вы также сможете увидеть, какие сборки он загружает в ActivationManager.RunPreStartMethods
(это на самом деле частный статический Assemblies
имущество).