Winform应用程序中的条件命名空间



我想知道在项目中定义名称空间的更好方法。我们有两个不同的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个项目使用相同的类/表单。

谢谢。

我会制作一个包含M2方法的通用接口:

 interface ICommonFun
 {
      void M2();
 }

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

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

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

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

sacklpicka的解决方案(使用接口)是解决这个问题的一种方法,使C1可以放入自己的库中。另一种方法是简单地将M2作为委托传递到C1的构造函数中,或者向C1提供一个每当调用M1时都会触发的事件,这样C1的用户就可以将他们的方法M2注册为事件处理程序。

相关内容

  • 没有找到相关文章

最新更新