从外部访问内部命名空间,而无需知道内部名称

本文关键字:内部 访问 命名空间 从外部 | 更新日期: 2023-09-27 18:32:32

我想我在这里把自己画进了一个角落:假设我有一堆代码在多个项目中使用的代码,所以我把它放在命名空间Company中。

然后所有特定于项目的代码都进入Company.Project .然后,我可以从项目命名空间调用库中的代码 - 外部命名空间 - 而无需指定命名空间 - 它是隐式导入的。好。

但是,假设我有一些代码在所有项目中使用,但每个项目都以不同的方式实现。例如,假设我有一个诊断窗口和代码,我可以在 WPF 或 Winforms 中实现,或者为每个项目提供不同的外观。由于它是逐个项目实现的,因此它不能进入Company命名空间,但是当它在项目命名空间中时,我只能通过指定内部命名空间从Company命名空间调用它 - 每个项目都会有所不同。

我想我可以使用代表来解决这个问题,但它似乎很混乱 - 有更简单的方法吗?

从外部访问内部命名空间,而无需知道内部名称

也许使用接口?在 Company 命名空间中定义接口。然后让每个项目实现接口。然后使用 Company 命名空间中的接口。

这种方法的一个缺点是,仍然需要在某处创建一个类来创建特定于项目的接口实现实例。就像某种工厂一样,它需要同时引用 Company 命名空间和实现它的特定于项目的类。

听起来你需要某种 IoC 并使用接口来解决这个问题。这是一个没有任何特殊库的简单方法:

// In your shared project
namespace Company {
    public interface IDiagnosticWindow {
        void ShowMessage(string message);
    }
    public static class Utilities {
        private static IDiagnosticWindow _diagnosticWindow;
        public static void InitializeDiagnosticWindow(IDiagnosticWindow dw) {
            _diagnosticWindow = dw;
        }
        public static void ShowMessage(string message) {
            _diagnosticWindow.ShowMessage(message);
        }
    }
}
// In your WinForms project
namespace Company.WinForms {
    public class WinFormsDiagnosticWindow : IDiagnosticWindow {
        public void ShowMessage(string message) {
            MessageBox.Show(message);
        }
    }
    static void Main() {
        Utilities.InitializeDiagnosticWindow(new WinFormsDiagnosticWindow());
    }
}

为其他应用程序以类似方式实现它。在此示例中,请务必在应用启动时手动初始化此设置。但是,如果您在 Main 中执行此操作,则它将被初始化,并且Utilities.ShowMessage将可用于核心项目或应用程序项目。

像 Ninject 这样的库也可以通过更好地连接这种关系来帮助你。