2

在将 Onion Architecture 与Windows Forms UI 层相结合时,我遇到了障碍。问题是我的IoC配置方法永远不会被命中。IoC 设置发生在依赖解析程序集中:

Project.Core
Project.Infrastructure
Project.UI                   <- Startup project 
Project.DependencyResolution <- IoC configuration

而且我希望我的 UI 层除了Project.Core.

在我使用此架构的 Web 项目中,我使用了 WebActivatorEx 和 OutputTo 来引导我的 IoC。因为我很熟悉,所以我决定在这里使用相同的,但它的行为不像预期的那样。我不确定我是问题还是 Windows 窗体是问题所以这是我的设置:

在 Project.DependencyResolution 中:

[assembly: WebActivatorEx.PreApplicationStartMethod(
    typeof (IocConfig), "RegisterDependencies")]

public class IocConfig
{
    public static void RegisterDependencies() {
        // this is never executed
    }
}

OutputTo 的 OutputTargets.txt:

..\Project.UI\bin    

在 Project.UI 中:

static class Program
{
    static void Main() {
        WebActivatorEx.ActivationManager.RunPreStartMethods();
        Application.Run(...);
    }
}

OutputToDependencyResolution's将 DLL 文件正确复制到Ui'sbin,但从IocConfig.RegisterDependencies不运行。

那么如何从它自己的程序集中设置 IoC,其中 Windows 窗体项目是启动项目?

4

1 回答 1

1

刚刚使用 WebActivatorEx 2.0.0.5(NuGet 中的最新版本)对此进行了测试。工作正常。通过在控制台中打印一些东西来检查RegisterDependencies

无论如何,它与作为 WinForms 应用程序没有任何关系(可能是控制台应用程序,它应该仍然可以工作)。

我现在唯一想到的是您的 UI 程序集不在其他程序集(包括 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属性)。

于 2014-07-29T00:05:03.060 回答