在两个带有事件的 C# 应用程序中使用 IoC 容器

Using IoC container in two C# apps with events

我在 Visual Studio 解决方案中有两个项目,一个是控制台应用程序,另一个是 WPF 应用程序。两者都有一个复合根,其中每个都实例化了一个公共引导程序并注册了一些公共类型。

我正在尝试让控制台应用程序订阅 WPF 应用程序发布的一些事件。当 WPF window 被移动、打开或调整大小时,控制台应用程序会在控制台上打印一个字符串。

Bootstrapper class 位于单独的 class 库中,代码如下:

public class Bootstrapper
{
    public void Initialize()
    {           
        var container = IocContainer.Instance.Container;

        container.Register<IOrderRepository, SqlOrderRepository>(Lifestyle.Singleton);
        container.Register<ILogger, FileLogger>(Lifestyle.Singleton);
        container.Register<IEventPublisher, EventPublisher>(Lifestyle.Singleton);
        container.Register<CancelOrderHandler>();
        container.Register<IViewsIntegrationService, ViewsIntegrationService>(
            Lifestyle.Singleton);

        try
        {
            // Verify the container
            container.Verify();
        }
        catch (Exception ex)
        {
            System.Console.WriteLine(ex.Message);
            System.Console.ReadLine();
        }
    }
}

两个应用程序的复合根中都有此代码:

 var bs = new Bootstrapper();
 bs.Initialize();

ViewsIntegrationService 触发 WPF 应用程序中的事件。 控制台应用订阅了 ViewsIntegrationService 个事件。

当我 运行 这两个应用程序时,控制台应用程序不接收事件并且控制台上不打印任何内容。

是否因为每个应用程序都使用单独的引导程序实例?因此有两组相同的注册?或者这是因为其他原因而不起作用?

尽管在同一个 Visual Studio 解决方案中有 2 个项目,但在编译时每个项目都是一个单独的 Windows 可执行程序。这两个程序不会自动相互通信。如果需要将信息从一个程序传输到另一个程序,则需要使用某种通信通道,例如 TCP 或 MSMQ。参见 Send/Receive message To/From two running application

或者,您可以将 "console application" 变成 class 库(当从 WPF 引用时,它将成为同一应用程序的一部分)并使用 WPF window 看起来像一个控制台应用程序window写出信息。

事件和依赖项注入仅影响单个应用程序,因此在跨应用程序边界通信的情况下两者都不相关。