我在将洋葱架构与 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/