【问题标题】:Conditional Namespace in Winform applicationWinform 应用程序中的条件命名空间
【发布时间】:2011-06-03 08:26:09
【问题描述】:

我想知道在我的项目中定义名称空间的更好方法。我们有 2 个不同的 winform 项目,并且我们在两个项目中都使用了某些代码文件和表单。所以项目1和2的结构如下:

//Project Pro1
//-------------------------------------
//Class C1 starts
#if pro1
using pro1
#endif
#if pro2
using pro2
#endif
namespace common_fun
{
Class C1
    Method M1
    {
        call to C2.M2
    }

}

//Class C2 starts
namespace pro1
{
Class C2
    Method M2

}

//Project Pro2
//----------------


#if pro1
using pro1
#endif
#if pro2
using pro2
#endif
namespace common_fun
{
Class C1
    Method M1
    {
        call to C2.M2
    }

}

namespace pro2
{
Class C2
    Method M2

}

所以在这里,类 C1(在命名空间 common_fun 下)是两个项目中使用的共享文件。但是我们需要调用类 C2 的方法 M2 并且为了调用该方法,我们需要在顶部编写条件 using 语句。即

#if pro1
using pro1
#elseif pro2
using pro2
#endif

所以我的问题是有没有更好的方法来包含公共文件的命名空间?将来可能会有 3-4 个项目使用相同的类/表单。

谢谢。

【问题讨论】:

    标签: winforms namespace-organisation global-namespace


    【解决方案1】:

    我会创建一个包含您的 M2 方法的通用接口:

     interface ICommonFun
     {
          void M2();
     }
    

    然后将该接口的实现传递给您的C1 类:

     class C1
     {
          ICommonFun Instance;
    
          public void M1()
          { 
             Instance.M2();
          }
    
          public C1(ICommonFun fun)
          {
              Instance = fun;
          }
      }
    

    【讨论】:

    • 感谢 sacklpicka,我们可以使用您的示例中所示的接口来管理命名空间(最好的方法之一)。
    【解决方案2】:

    我们在两个项目中都使用了某些代码文件和表单。

    如果我理解正确,您可以在两个项目中引用这些代码文件,而不是将它们放入单独的程序集中。如果您尝试将“公共类”放在这样的库中(因为这是编写可重用代码时的最佳实践),您会注意到编译器/链接器不会让您这样做:相反,它会已经告诉你你在这里真正拥有的东西:C1 和 C2 的所有变体之间的循环依赖。这是您在创建要在不同项目之间共享的代码时真正应该避免的事情,因为它们使代码难以测试和维护(您已经注意到了,因为您的命名空间问题是可能发生的典型问题之一情况)。

    sacklpicka 的解决方案(使用接口)是解决此问题的一种方法,使 C1 准备好放入它自己的库中。另一种是简单地将M2作为C1的构造函数中的委托传递,或者给C1一个在调用M1时触发的事件,因此C1的用户可以将他们的方法M2注册为事件处理程序.

    【讨论】:

    • 感谢 Brown 的替代建议。现在,我们将使用上面建议的接口方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2015-03-06
    • 2012-01-26
    • 2018-07-30
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多