c# - 从另一个程序集引导 Windows 窗体项目

标签 c# winforms onion-architecture webactivator

我在将洋葱架构与 Windows Forms 相结合时遇到了障碍界面层。问题是我的 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(...);
    }
}

OutputTo 将 DependencyResolution 的 DLL 文件正确复制到 Ui 的 bin,但 IocConfig.RegisterDependencies 永远不会运行。

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

最佳答案

刚刚使用 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 中看到它加载了哪些程序集(它实际上是私有(private)静态 Assemblies 属性)。

关于c# - 从另一个程序集引导 Windows 窗体项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25005696/

相关文章:

c# - 如何为 Redlock.Net 启用日志记录?

c# - 如何创建和应用密文?

c# - 如何删除在 webbrowser 控件中导航的文件?

c# - 在洋葱架构中将 ConnectionString 放在哪里

c# - 在 ASP.NET 5 和 MVC 6 中将启动配置与 Web 项目分离的最佳方法

c# - 在分层架构中,应用层如何知道 Web URL?

c# - 绑定(bind)到 WPF 中的 TreeView

c# - AjaxControlToolkit 饼图未正确呈现

c# - 无法从线程启动 winForm

c# - Visual Studio 2012 如何绘制其窗口边框?