从外部访问内部命名空间,而无需知道内部名称
本文关键字:内部 访问 命名空间 从外部 | 更新日期: 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 这样的库也可以通过更好地连接这种关系来帮助你。