从外部访问内部命名空间而不知道内部名称

时间:2013-09-23 18:58:02

标签: c# namespaces

我想我已经把自己描绘成了一个角落:让我说我有一堆代码,我在多个项目中使用,所以我把它放在命名空间Company中。

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

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

我想我可以使用代理来解决这个问题,但这看起来很麻烦 - 有更简单的方法吗?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

听起来你需要某种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这样的图书馆也可以通过更好地联系这种关系来帮助你。